Re: [R] How to split two levels several times?
Hi Arun, thanks. Great help. I tested the code for several tables and your function works well. Dennis Gesendet: Freitag, 26. Juli 2013 um 15:43 Uhr Von: arun smartpink...@yahoo.com An: dennis1...@gmx.net dennis1...@gmx.net Cc: R help r-help@r-project.org, Rui Barradas ruipbarra...@sapo.pt Betreff: Re: [R] How to split two levels several times? It would be better to wrap it in a function. fun1- function(x,colName,N,value){ rl- rle(as.character(x[,colName])) dat-do.call(rbind,lapply(seq_along(rl$lengths),function(i){x1-if(rl$values[i]==value (rl$lengths[i]%/%N1)) rep(N,rl$lengths[i]%/%N) else rl$lengths[i];data.frame(Len=x1,Val=rl$values[i])})) lst1-split(cumsum(dat[,1]),((seq_along(dat[,1])-1)%/%2)+1) vec1-sapply(lst1,max) vec2-c(1,vec1[-length(vec1)]+1) res- lapply(seq_along(lst1),function(i) {x1-lst1[[i]]; x[seq(vec2[i],max(x1)),]}) res } fun1(XXX,electrode,6,electrode4) #Using previous dataset XXX, XXX1, XXX2 fun1(XXX,electrode,3,electrode1) fun1(XXX1,electrode,3,electrode1) fun1(XXX2,electrode,3,electrode1) A.K. - Original Message - From: arun smartpink...@yahoo.com To: dennis1...@gmx.net dennis1...@gmx.net Cc: R help r-help@r-project.org; Rui Barradas ruipbarra...@sapo.pt Sent: Friday, July 26, 2013 9:26 AM Subject: Re: [R] How to split two levels several times? Hi Dennis, I guess in this case, instead of Eletrode1 occuring 3 times, it is Electrode4 exists only 6 times. If that is the situation: just change: XXX: data rl-rle(as.character(XXX$electrode)) dat-do.call(rbind,lapply(seq_along(rl$lengths),function(i){x1-if(rl$values[i]==electrode4 (rl$lengths[i]%/%61)) rep(6,rl$lengths[i]%/%6) else rl$lengths[i];data.frame(Len=x1,Val=rl$values[i])})) lst1-split(cumsum(dat[,1]),((seq_along(dat[,1])-1)%/%2)+1) vec1-sapply(lst1,max) vec2-c(1,vec1[-length(vec1)]+1) res- lapply(seq_along(lst1),function(i) {x1-lst1[[i]]; XXX[seq(vec2[i],max(x1)),]}) res [[1]] electrode length 1 electrode1 206 2 electrode1 194 3 electrode1 182 4 electrode1 172 5 electrode1 169 6 electrode2 82 7 electrode2 78 8 electrode2 70 9 electrode2 58 [[2]] electrode length 10 electrode1 206 11 electrode1 194 12 electrode1 182 13 electrode1 172 14 electrode1 169 15 electrode3 260 16 electrode3 176 17 electrode3 137 [[3]] electrode length 18 electrode1 206 19 electrode1 194 20 electrode1 182 21 electrode1 172 22 electrode1 169 23 electrode4 86 24 electrode4 66 25 electrode4 64 26 electrode4 52 27 electrode4 27 28 electrode4 26 [[4]] electrode length 29 electrode2 82 30 electrode2 78 31 electrode2 70 32 electrode2 58 33 electrode1 206 34 electrode1 194 35 electrode1 182 36 electrode1 172 37 electrode1 169 [[5]] electrode length 38 electrode2 82 39 electrode2 78 40 electrode2 70 41 electrode2 58 42 electrode3 260 43 electrode3 176 44 electrode3 137 [[6]] electrode length 45 electrode2 82 46 electrode2 78 47 electrode2 70 48 electrode2 58 49 electrode4 86 50 electrode4 66 51 electrode4 64 52 electrode4 52 53 electrode4 27 54 electrode4 26 [[7]] electrode length 55 electrode3 260 56 electrode3 176 57 electrode3 137 58 electrode1 206 59 electrode1 194 60 electrode1 182 61 electrode1 172 62 electrode1 169 [[8]] electrode length 63 electrode3 260 64 electrode3 176 65 electrode3 137 66 electrode2 82 67 electrode2 78 68 electrode2 70 69 electrode2 58 [[9]] electrode length 70 electrode3 260 71 electrode3 176 72 electrode3 137 73 electrode4 86 74 electrode4 66 75 electrode4 64 76 electrode4 52 77 electrode4 27 78 electrode4 26 [[10]] electrode length 79 electrode4 86 80 electrode4 66 81 electrode4 64 82 electrode4 52 83 electrode4 27 84 electrode4 26 85 electrode1 206 86 electrode1 194 87 electrode1 182 88 electrode1 172 89 electrode1 169 [[11]] electrode length 90 electrode4 86 91 electrode4 66 92 electrode4 64 93 electrode4 52 94 electrode4 27 95 electrode4 26 96 electrode2 82 97 electrode2 78 98 electrode2 70 99 electrode2 58 [[12]] electrode length 100 electrode4 86 101 electrode4 66 102 electrode4 64 103 electrode4 52 104 electrode4 27 105 electrode4 26 106 electrode3 260 107 electrode3 176 108 electrode3 137 A.K. - Original Message - From: dennis1...@gmx.net dennis1...@gmx.net To: Rui Barradas ruipbarra...@sapo.pt; r-help@r-project.org Cc: Sent: Friday, July 26, 2013 6:07 AM Subject: Re: [R] How to split two levels several times? Hi Rui Arun, really thanks for investing so much
Re: [R] How to split two levels several times?
Hi Rui Arun, really thanks for investing so much time to deal with this problem! The code works now for this specific example. However it is not generally robust for slightly different situations. For instance it cannot correctly handle a slight variation of the table where I have again 4 types of electrodes of certain lengths. Electrode4 exists only 6 times. At the transition of the combinations 3-4 and 4-1 there are 12 times electrode4 which stick together in the output $`9`. This leads to wrong splittings thereafter. Sorry for asking such tricky questions. New table XXX electrode length electrode1 206 electrode1 194 electrode1 182 electrode1 172 electrode1 169 electrode2 82 electrode2 78 electrode2 70 electrode2 58 electrode1 206 electrode1 194 electrode1 182 electrode1 172 electrode1 169 electrode3 260 electrode3 176 electrode3 137 electrode1 206 electrode1 194 electrode1 182 electrode1 172 electrode1 169 electrode4 86 electrode4 66 electrode4 64 electrode4 52 electrode4 27 electrode4 26 electrode2 82 electrode2 78 electrode2 70 electrode2 58 electrode1 206 electrode1 194 electrode1 182 electrode1 172 electrode1 169 electrode2 82 electrode2 78 electrode2 70 electrode2 58 electrode3 260 electrode3 176 electrode3 137 electrode2 82 electrode2 78 electrode2 70 electrode2 58 electrode4 86 electrode4 66 electrode4 64 electrode4 52 electrode4 27 electrode4 26 electrode3 260 electrode3 176 electrode3 137 electrode1 206 electrode1 194 electrode1 182 electrode1 172 electrode1 169 electrode3 260 electrode3 176 electrode3 137 electrode2 82 electrode2 78 electrode2 70 electrode2 58 electrode3 260 electrode3 176 electrode3 137 electrode4 86 electrode4 66 electrode4 64 electrode4 52 electrode4 27 electrode4 26 electrode4 86 electrode4 66 electrode4 64 electrode4 52 electrode4 27 electrode4 26 electrode1 206 electrode1 194 electrode1 182 electrode1 172 electrode1 169 electrode4 86 electrode4 66 electrode4 64 electrode4 52 electrode4 27 electrode4 26 electrode2 82 electrode2 78 electrode2 70 electrode2 58 electrode4 86 electrode4 66 electrode4 64 electrode4 52 electrode4 27 electrode4 26 electrode3 260 electrode3 176 electrode3 137 Gesendet: Donnerstag, 25. Juli 2013 um 20:53 Uhr Von: Rui Barradas ruipbarra...@sapo.pt An: dennis1...@gmx.net Cc: r-help@r-project.org Betreff: Re: Aw: Re: Re: Re: [R] How to split two levels several times? Hello, I think the following does what you want. (I don't know if it makes much sense but it works.) lens - rle(as.character(XXX$electrode))$lengths m - length(lens) %/% 2 idx - rep(1:m, sapply(1:m, function(.m) sum(lens[(2*.m - 1):(2*.m)]))) if(length(lens) %% 2 != 0){ idx - c(idx, rep(m + 1, lens[length(lens)])) sp_idx - split(idx, idx) n - length(sp_idx[[m]]) if(n %/% 2 length(sp_idx[[m + 1]])) sp_idx[[m]][(n %/% 2 + 1):n] - sp_idx[[m + 1]][1] else sp_idx[[m]][(n - length(sp_idx[[m + 1]]) + 1):n] - sp_idx[[m + 1]][1] idx - unlist(sp_idx) } sp - split(XXX, idx) sp Rui Barradas Em 25-07-2013 11:40, dennis1...@gmx.net escreveu: Hi Rui once more thank you for your help. But the code does so far not solve the problem because it still treats rows 17-22 (repeated appearance of electrode1) as one single level. However as can be seen by rows 1-3 (or rows 17-19 and rows 20-22) and the order of the length variable (row 1 = 5.7, row 2 = 6.3, row 3 = 6.2) electrode1 consists only of 3 rows. Maybe that was not made absolutely clear by me. As described in my mail before if by chance (or systematically) it happens to be that electrode1 appears right after each other in the table then the code should split it “half way”. So idx should not return [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 but instead 6 times number 4 at the end [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 Do you have any solution? Gesendet: Mittwoch, 24. Juli 2013 um 23:47 Uhr Von: Rui Barradas ruipbarra...@sapo.pt An: dennis1...@gmx.net Cc: r-help@r-project.org Betreff: Re: Aw: Re: Re: [R] How to split two levels several times? Hello, As for the first question, note that in the case you describe, the resulting list of df's will not be a split of the original, there will be a duplication in the final 4-1 and 1-3. The following is a hack but will do it. lens -
Re: [R] How to split two levels several times?
Hi Rui once more thank you for your help. But the code does so far not solve the problem because it still treats rows 17-22 (repeated appearance of electrode1) as one single level. However as can be seen by rows 1-3 (or rows 17-19 and rows 20-22) and the order of the length variable (row 1 = 5.7, row 2 = 6.3, row 3 = 6.2) electrode1 consists only of 3 rows. Maybe that was not made absolutely clear by me. As described in my mail before if by chance (or systematically) it happens to be that electrode1 appears right after each other in the table then the code should split it “half way”. So idx should not return [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 but instead 6 times number 4 at the end [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 Do you have any solution? Gesendet: Mittwoch, 24. Juli 2013 um 23:47 Uhr Von: Rui Barradas ruipbarra...@sapo.pt An: dennis1...@gmx.net Cc: r-help@r-project.org Betreff: Re: Aw: Re: Re: [R] How to split two levels several times? Hello, As for the first question, note that in the case you describe, the resulting list of df's will not be a split of the original, there will be a duplication in the final 4-1 and 1-3. The following is a hack but will do it. lens - rle(as.character(XXX$electrode))$lengths m - length(lens) %/% 2 idx - rep(1:m, sapply(1:m, function(.m) sum(lens[(2*.m - 1):(2*.m)]))) if(length(lens) %% 2 != 0) idx - c(idx, rep(m + 1, lens[length(lens)])) sp - split(XXX, idx) if(length(lens) %% 2 != 0){ idx2 - sp[[m]]$electrode == sp[[m]]$electrode[nrow(sp[[m]])] sp[[m + 1]] - rbind(sp[[m]][idx2, ], sp[[m + 1]]) } sp As for the second question, I'm not understanding it, can you post sample output? Rui Barradas Em 24-07-2013 13:58, dennis1...@gmx.net escreveu: Hi Rui the splitting code worked fine. Thanks for your help. Now I realized that the code cannot handle a table with levels that by chance (or systematically) repeatedly appear after each other. For instance this may happen if I need to extract the final two pairs of the table XXX below: electrode4+electrode1 and electrode1+electrode3. lens - rle(as.character(XXX$electrode))$lengths will return 3 2 3 2 6 6 3 and not 3 2 3 2 6 3 3 3 because it counts electrode1 double. split(XXX, idx) will produce 3 incorrect outputs instead of the required 4. This will also occur if I have systematic combinations 1-4 after each other for instance in a new table “XX” below where electrode4 appears twice. Is there a way to make splitting half-way between two of the same levels possible by predefining the length of each individual level? This would make the splitting code more robust. Thanks for advice. This is the table XXX electrode length electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode2 11.4 electrode2 9.7 electrode3 14.2 electrode3 14.8 electrode3 12.6 electrode2 11.4 electrode2 9.7 electrode4 17.0 electrode4 16.3 electrode4 17.8 electrode4 18.3 electrode4 16.9 electrode4 18.5 electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode3 14.2 electrode3 14.8 electrode3 12.6 This is a simplified table XX electrode1 electrode2 electrode1 electrode3 electrode1 electrode4 electrode2 electrode1 electrode2 electrode3 electrode2 electrode4 electrode3 electrode1 electrode3 electrode2 electrode3 electrode4 electrode4 electrode1 electrode4 electrode2 electrode4 electrode3 Gesendet: Dienstag, 23. Juli 2013 um 13:36 Uhr Von: Rui Barradas ruipbarra...@sapo.pt An: dennis1...@gmx.net Cc: smartpink...@yahoo.com, 'r-help' r-help@r-project.org Betreff: Re: Aw: Re: [R] How to split two levels several times? Hello, It's better if you keep this on the list, the odds of getting more and better answers are greater. As for your new question, try the following. lens - rle(as.character(XXX$electrode))$lengths m - length(lens) %/% 2 idx - rep(1:m, sapply(1:m, function(.m) sum(lens[(2*.m - 1):(2*.m)]))) split(XXX, idx) Hope this helps, Rui Barradas Em 23-07-2013 11:41, dennis1...@gmx.net escreveu: Hi this type of splitting works for my specific example. Thanks for your help. I was not absolutely clear what I generally want. I'm looking for an option that generally permits splitting two joint levels of a table after each other. For instance for the table below I want it to be divided into combinations electrode1-electrode2, electrode3-electrode2, electrode4-electrode1. How should I split this? This is the table XXX electrode length electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode2 11.4 electrode2 9.7 electrode3 14.2 electrode3 14.8 electrode3 12.6 electrode2 11.4 electrode2 9.7 electrode4 17.0 electrode4 16.3 electrode4 17.8 electrode4 18.3
Re: [R] How to split two levels several times?
Hi Rui the splitting code worked fine. Thanks for your help. Now I realized that the code cannot handle a table with levels that by chance (or systematically) repeatedly appear after each other. For instance this may happen if I need to extract the final two pairs of the table XXX below: electrode4+electrode1 and electrode1+electrode3. lens - rle(as.character(XXX$electrode))$lengths will return 3 2 3 2 6 6 3 and not 3 2 3 2 6 3 3 3 because it counts electrode1 double. split(XXX, idx) will produce 3 incorrect outputs instead of the required 4. This will also occur if I have systematic combinations 1-4 after each other for instance in a new table “XX” below where electrode4 appears twice. Is there a way to make splitting half-way between two of the same levels possible by predefining the length of each individual level? This would make the splitting code more robust. Thanks for advice. This is the table XXX electrode length electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode2 11.4 electrode2 9.7 electrode3 14.2 electrode3 14.8 electrode3 12.6 electrode2 11.4 electrode2 9.7 electrode4 17.0 electrode4 16.3 electrode4 17.8 electrode4 18.3 electrode4 16.9 electrode4 18.5 electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode3 14.2 electrode3 14.8 electrode3 12.6 This is a simplified table XX electrode1 electrode2 electrode1 electrode3 electrode1 electrode4 electrode2 electrode1 electrode2 electrode3 electrode2 electrode4 electrode3 electrode1 electrode3 electrode2 electrode3 electrode4 electrode4 electrode1 electrode4 electrode2 electrode4 electrode3 Gesendet: Dienstag, 23. Juli 2013 um 13:36 Uhr Von: Rui Barradas ruipbarra...@sapo.pt An: dennis1...@gmx.net Cc: smartpink...@yahoo.com, 'r-help' r-help@r-project.org Betreff: Re: Aw: Re: [R] How to split two levels several times? Hello, It's better if you keep this on the list, the odds of getting more and better answers are greater. As for your new question, try the following. lens - rle(as.character(XXX$electrode))$lengths m - length(lens) %/% 2 idx - rep(1:m, sapply(1:m, function(.m) sum(lens[(2*.m - 1):(2*.m)]))) split(XXX, idx) Hope this helps, Rui Barradas Em 23-07-2013 11:41, dennis1...@gmx.net escreveu: Hi this type of splitting works for my specific example. Thanks for your help. I was not absolutely clear what I generally want. I'm looking for an option that generally permits splitting two joint levels of a table after each other. For instance for the table below I want it to be divided into combinations electrode1-electrode2, electrode3-electrode2, electrode4-electrode1. How should I split this? This is the table XXX electrode length electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode2 11.4 electrode2 9.7 electrode3 14.2 electrode3 14.8 electrode3 12.6 electrode2 11.4 electrode2 9.7 electrode4 17.0 electrode4 16.3 electrode4 17.8 electrode4 18.3 electrode4 16.9 electrode4 18.5 electrode1 5.7 electrode1 6.3 electrode1 6.2 Gesendet: Montag, 22. Juli 2013 um 17:53 Uhr Von: Rui Barradas ruipbarra...@sapo.pt An: dennis1...@gmx.net Cc: r-help@r-project.org Betreff: Re: [R] How to split two levels several times? Hello, Sorry, I've just realized that your data frame is named 'XXX', not 'dat'. Change that and the rest should work: idx - cumsum(c(TRUE, diff(XXX$electrode == electrode1) 0)) split(XXX, idx) Rui Barradas Em 22-07-2013 16:47, Rui Barradas escreveu: Hello, Try the following. idx - cumsum(c(TRUE, diff(dat$electrode == electrode1) 0)) split(dat, idx) Hope this helps, Rui Barradas Em 22-07-2013 15:09, dennis1...@gmx.net escreveu: Hi, I have a small problem with the function split() and would appreciate your help. I have a table called “XXX” with 2 columns and 49 rows. The 49 rows belong to 8 different levels (electrode1, ...,electrode8). I want to split the table always at the row where “electrode1” starts again so that I can export 7 individual dataframes (numbered “dataframe1” to ”dataframe7”) which contain always electrode1 as first level (always three rows) with the varying number of rows for electrodes2-8 below. I tried the split function with various setups: t - as.factor(XXX$electrode) dataframeX - split(XXX, f=(levels=t)) But this doesn’t work. Could you please help. Thank you! Dennis This is the table XXX electrodelength electrode15.7 electrode16.3 electrode16.2 electrode211.4 electrode29.7 electrode15.7 electrode16.3 electrode16.2 electrode314.2 electrode314.8 electrode312.6 electrode15.7 electrode16.3 electrode16.2 electrode417.0 electrode416.3 electrode417.8 electrode418.3 electrode416.9 electrode418.5 electrode1
[R] How to split two levels several times?
Hi, I have a small problem with the function split() and would appreciate your help. I have a table called “XXX” with 2 columns and 49 rows. The 49 rows belong to 8 different levels (electrode1, ...,electrode8). I want to split the table always at the row where “electrode1” starts again so that I can export 7 individual dataframes (numbered “dataframe1” to ”dataframe7”) which contain always electrode1 as first level (always three rows) with the varying number of rows for electrodes2-8 below. I tried the split function with various setups: t - as.factor(XXX$electrode) dataframeX - split(XXX, f=(levels=t)) But this doesn’t work. Could you please help. Thank you! Dennis This is the table XXX electrode length electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode2 11.4 electrode2 9.7 electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode3 14.2 electrode3 14.8 electrode3 12.6 electrode1 5.7 electrode1 6.3 electrode1 6.2 electrode4 17.0 electrode4 16.3 electrode4 17.8 electrode4 18.3 electrode4 16.9 electrode4 18.5 electrode1 electrode5 electrode1 electrode6 electrode1 electrode7 electrode1 electrode8 __ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.