Re: [R] How to split two levels several times?

2013-07-29 Thread dennis1991
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?

2013-07-26 Thread dennis1991
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?

2013-07-25 Thread dennis1991
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?

2013-07-24 Thread dennis1991
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?

2013-07-22 Thread dennis1991
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.