2015-11-26 50 views
2

我有一個數據幀每行一個值,可能在幾列之一。我如何創建一個包含1所在列號的列?我想用dplyr來做到這一點,但我能想到的唯一方法是循環,這看起來很不像R。重新編碼值到一列

df<-data.frame(
    a=c(1,0,0,0), 
    b=c(0,1,1,0), 
    c=c(0,0,0,1) 
) 

    a b c 
1 1 0 0 
2 0 1 0 
3 0 1 0 
4 0 0 1 

目標:

1 1 
2 2 
3 2 
4 3 

回答

6

沒有必要dplyr這裏。這是max.col()的用途。由於該行中的所有其他值都將爲零,因此max.col()會給出出現1的列號。

max.col(df) 
# [1] 1 2 2 3 

如果你需要一列,然後

data.frame(x = max.col(df)) 
# x 
# 1 1 
# 2 2 
# 3 2 
# 4 3 

或者cbind()matrix()的矩陣。

+0

真棒感謝。當我看到你的第一篇文章時,我使用了:矩陣(max.col(df),ncol = 1)' – Rilcon42

1

我們也可以做

as.matrix(df) %*%seq_along(df) 
#  [,1] 
#[1,] 1 
#[2,] 2 
#[3,] 2 
#[4,] 3 
0
which(df==1, arr.ind=T) 
#  row col 
# [1,] 1 1 
# [2,] 2 2 
# [3,] 3 2 
# [4,] 4 3