将值重新编码为一列

时间:2015-11-26 01:43:46

标签: r dplyr

我有一个数据帧,每行有一个值,可能在几列之一。如何创建包含1所在列号的单个列?我想用dplyr做这个,但是我能想到的唯一方法涉及到循环,这似乎非常不像。

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

3 个答案:

答案 0 :(得分: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()表示矩阵。

答案 1 :(得分:1)

我们也可以

as.matrix(df) %*%seq_along(df)
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    2
#[4,]    3

答案 2 :(得分:0)

which(df==1, arr.ind=T)
#      row col
# [1,]   1   1
# [2,]   2   2
# [3,]   3   2
# [4,]   4   3