2013-09-30 29 views
2

我需要你的帮助,新的数据,我有这样的节约从data.frame

int x y z 
1 0 1 0 
2 1 0 0 
3 0 0 1 

数据帧和结果,我需要必须是这样的

int letter 

1 y 
2 x 
3 z 

我的代码是:

for (i in 1:nrow(samples)) 
    for(j in 1:ncol(samples)) 
     if(samples[i,][,j] == 1) print(c(i,names(samples[i,j]))) 

但它不显示第二列,我需要保存在一个新的data.frame,任何建议吗?谢谢。

回答

3

我敢肯定有很多方法,但这里有一个:

samples <- read.table(text="int x y z 
1 0 1 0 
2 1 0 0 
3 0 0 1", 
header=TRUE) 

# int x y z 
#1 1 0 1 0 
#2 2 1 0 0 
#3 3 0 0 1 

data.frame(
samples[1], 
letter=colnames(samples[-1][apply(samples[-1],1,which.max)]) 
) 

# int letter 
#1 1  y 
#2 2  x 
#3 3  z 
+0

+1。你击败了我。但是我的答案使用'names()[zzz]'而不是'colnames(zzz [])'和'zzz [,idx]'而不是'zzz [idx]',所以我会放弃它! – Frank

4

您可以使用max.col

dat$newcol <- names(DF)[-1][max.col(DF[-1])] 

这给

int x y z newcol 
1 1 0 1 0  y 
2 2 1 0 0  x 
3 3 0 0 1  z 
0

一种解决this类似的问题。

tdf <- data.frame(
    A = c(1,1,0,0), 
    B = c(0,0,1,0), 
    C = c(0,0,0,1) 
) 

library(magrittr) 

tdf %>% 
    lapply(sum) %>% 
    (function(x){ 
    a <- c() 
    for(i in 1:length(x)){ 
     a <- c(a, rep(names(x[i]), x[i])) 
    } 
    return(a) 
    })