2013-09-30 57 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) 
    })