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]%/%N>1)) 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]%/%6>1)) 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 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 <- 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.

Reply via email to