May be this also helps: XXX: dataset rl<-rle(as.character(XXX$electrode)) dat<-do.call(rbind,lapply(seq_along(rl$lengths),function(i){x1<-if(rl$values[i]=="electrode1" & (rl$lengths[i]%/%3>1)) rep(3,rl$lengths[i]%/%3) 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 5.7 #2 electrode1 6.3 #3 electrode1 6.2 #4 electrode2 11.4 #5 electrode2 9.7 # #[[2]] # electrode length #6 electrode3 14.2 #7 electrode3 14.8 #8 electrode3 12.6 #9 electrode2 11.4 #10 electrode2 9.7 # #[[3]] # electrode length #11 electrode4 17.0 #12 electrode4 16.3 #13 electrode4 17.8 #14 electrode4 18.3 #15 electrode4 16.9 #16 electrode4 18.5 #17 electrode1 5.7 #18 electrode1 6.3 #19 electrode1 6.2
#[[4]] # electrode length #20 electrode1 5.7 #21 electrode1 6.3 #22 electrode1 6.2 #23 electrode3 14.2 #24 electrode3 14.8 #25 electrode3 12.6 Also, tested in cases like below: XXX1<- structure(list(electrode = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L), .Label = c("electrode1", "electrode2", "electrode3", "electrode4"), class = "factor"), length = c(5.7, 6.3, 6.2, 11.4, 9.7, 14.2, 14.8, 12.6, 11.4, 9.7, 17, 16.3, 17.8, 18.3, 16.9, 18.5, 5.7, 6.3, 6.2, 7.7, 7.3, 6.2, 6.7, 6.8, 6.9, 5.7, 6.3, 6.2, 14.2, 14.8, 12.6)), .Names = c("electrode", "length"), class = "data.frame", row.names = c(NA, -31L)) XXX2<-structure(list(electrode = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 2L, 2L, 4L, 4L, 4L, 4L, 4L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L), .Label = c("electrode1", "electrode2", "electrode3", "electrode4"), class = "factor"), length = c(5.7, 6.3, 6.2, 11.4, 9.7, 14.2, 14.8, 12.6, 11.4, 9.7, 17, 16.3, 17.8, 18.3, 16.9, 18.5, 5.7, 6.3, 6.2, 7.7, 7.3, 6.2, 6.7, 6.8, 6.9, 14.2, 14.8, 12.6)), .Names = c("electrode", "length"), class = "data.frame", row.names = c(NA, -28L)) rl<-rle(as.character(XXX1$electrode)) dat<-do.call(rbind,lapply(seq_along(rl$lengths),function(i){x1<-if(rl$values[i]=="electrode1" & (rl$lengths[i]%/%3>1)) rep(3,rl$lengths[i]%/%3) 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) res1<- lapply(seq_along(lst1),function(i) {x1<-lst1[[i]]; XXX1[seq(vec2[i],max(x1)),]}) rl<-rle(as.character(XXX2$electrode)) dat<-do.call(rbind,lapply(seq_along(rl$lengths),function(i){x1<-if(rl$values[i]=="electrode1" & (rl$lengths[i]%/%3>1)) rep(3,rl$lengths[i]%/%3) 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) res2<- lapply(seq_along(lst1),function(i) {x1<-lst1[[i]]; XXX2[seq(vec2[i],max(x1)),]}) Didn't test it extensively. So, it may fail in other situations. A.K. ----- Original Message ----- From: Rui Barradas <ruipbarra...@sapo.pt> To: dennis1...@gmx.net Cc: r-help@r-project.org Sent: Thursday, July 25, 2013 2:53 PM Subject: 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 <- 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 >>>>> 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" >>>>>>>> >>>>>>>> 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. >>>>>>>> >>>>>>> >>>>>>> ______________________________________________ >>>>>>> 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. >>>>>> >>>> >> ______________________________________________ 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. ______________________________________________ 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.