【问题标题】:recode values into one column将值重新编码为一列
【发布时间】:2015-11-26 01:43:45
【问题描述】:

我有一个数据框,每行一个值,可能在几列之一。如何创建包含 1 所在的列号的单个列?我想使用 dplyr 来做到这一点,但我能想到的唯一方法涉及 for 循环,这似乎很不像 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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这里不需要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() 用于矩阵。

    【讨论】:

    • 非常感谢。当我看到你的第一篇文章时,我使用了:matrix(max.col(df),ncol=1)
    【解决方案2】:

    我们也可以

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

    【讨论】:

      【解决方案3】:
      which(df==1, arr.ind=T)
      #      row col
      # [1,]   1   1
      # [2,]   2   2
      # [3,]   3   2
      # [4,]   4   3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多