【问题标题】:For each row in data.table, find column name where value == X对于 data.table 中的每一行,找到 value == X 的列名
【发布时间】:2017-10-13 08:45:40
【问题描述】:

我有一个格式如下的数据表:

Name X1234 X5555 X3000 X5000 X7500 X8745 X9451 X8338 X8377 Object 1 0+ 0+ 1+ 0+ 0+ 0+ 0+ 0+ 0+ Object 2 1+ 0+ 0+ 0+ 0+ 0+ 0+ 0+ 0+ Object 3 0+ 0+ 0+ 0+ 1+ 0+ 0+ 0+ 0+

我的数据表有几百行;假设对象 1 到 100。所有结构如下。每行,因此对象,包含一百多列。在其中一列(名称是动态的,但始终以 X 开头)中,我正在寻找值 1+。我要完成的下一步是添加一个额外的列,我们将其命名为 Number,并用行的值 == 1+ 的列名填充它。

所以,我想要的结果是:

Name X1234 X5555 X3000 X5000 X7500 X8745 X9451 X8338 Number Object 1 0+ 0+ 1+ 0+ 0+ 0+ 0+ 0+ X3000 Object 2 1+ 0+ 0+ 0+ 0+ 0+ 0+ 0+ X1234 Object 3 0+ 0+ 0+ 0+ 1+ 0+ 0+ 0+ X7500

在 R 中,最好的方法是什么?我已经查找并尝试了 apply、which 等功能,但遗憾的是还没有找到可行的解决方案。

我对在 R 中开发脚本相当陌生,所以如果我的问题不清楚或难以回答,我深表歉意。

Python 中的类似情况: Find the column name which has the maximum value for each row

【问题讨论】:

标签: r


【解决方案1】:

which 的方法:

dat$Number <- names(dat)[which(dat == "1+", arr.ind = TRUE)[ , 2]]
# [1] "X1234" "X3000" "X7500"

【讨论】:

    【解决方案2】:

    您可以使用 apply 和 which:

    df <- data.frame( x1 = c(0, 0, 1), x2 = c(1, 0 , 0), x3 = c(0, 1 , 0) )
    idx <- apply( df, 1, function(row) which( row == 1 ) )
    cbind( df, Number = colnames( df[ , idx] ) )
    
      x1 x2 x3 Number
    1  0  1  0     x2
    2  0  0  1     x3
    3  1  0  0     x1
    

    【讨论】:

      【解决方案3】:

      我们可以使用max.col 来查找逻辑矩阵的列索引(df1[-1]=="1+")。加 1 是因为我们只使用了第二列。然后,用names(df1)得到对应的名字

      df1$Number <- names(df1)[max.col(df1[-1]=="1+")+1]
      df1$Number
      #[1] "X3000" "X1234" "X7500"
      

      【讨论】:

        【解决方案4】:

        您还可以使用col 函数返回正确的变量名称索引,如下所示:

        names(mat)[col(mat)[which(mat == "1+")]]
        [1] "X1234" "X3000" "X7500"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-11
          • 1970-01-01
          • 1970-01-01
          • 2018-10-03
          • 2018-09-18
          相关资源
          最近更新 更多