[R] Data manipulation in a data.frame

arun smartpink111 at yahoo.com
Sat Feb 22 01:51:44 CET 2014


Hi Ioanna,
If you need to paste the colnames if there are multiple 1's per row:
You could try:
A<-data.frame(A=c(10,100,1000,30,50,60,300,3,4,2,20,35,45),B=c(0,1,1,1,0,0,0,0,0,1,0,0,1),C=c(0,0,0,0,1,1,0,0,0,0,1,1,1),D=c(1,0,0,0,0,0,1,0,0,1,NA,1,1))
apply(A[,-1],1,function(x) {x1 <-paste(colnames(A[,-1])[x & !is.na(x)],collapse=","); x1[x1=='']<- "none";x1})
#[1] "D"     "B"     "B"     "B"     "C"     "C"     "D"     "none"  "none" 
#[10] "B,D"   "C"     "C,D"   "B,C,D"



#or Bert's method with some modification:
 c("none",names(A)[-1],"B,D","C,D","B,C,D")[c(as.matrix(!!A[,-1]&!is.na(A[,-1]))%*%seq_len(ncol(A)-1)+1)]
# [1] "D"     "B"     "B"     "B"     "C"     "C"     "D"     "none"  "none" 
#[10] "B,D"   "C"     "C,D"   "B,C,D"
  

But, in this case, you may need to check if the combinations are there or not in the dataset, Otherwise

For e.g.
 c("none",names(A)[-1],apply(combn(LETTERS[2:4],2),2,paste,collapse=","),"B,C,D")[c(as.matrix(!!A[,-1]&!is.na(A[,-1]))%*%seq_len(ncol(A)-1)+1)]
# [1] "D"    "B"    "B"    "B"    "C"    "C"    "D"    "none" "none" "B,C" 
#[11] "C"    "B,D"  "C,D" 


A.K.




On Friday, February 21, 2014 4:20 PM, ioanna ioannou <ii54250 at msn.com> wrote:
Hello Arun, 

Actually I do have rows with multiple 1s. Could you advise how to modify the
code then?

Thanks in advance, 

Best
IOanna




More information about the R-help mailing list