对于data.table中的每一行,找到列名称,其中value == X.

时间:2017-10-13 08:45:40

标签: r

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

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.所有结构如下。每行,因此对象,包含100 +列。在其中一列中(名称是动态的,但始终以 X 开头)我正在寻找值 1 + 。我想要完成的下一步是添加一个额外的列,让我们将其命名为数字,并使用列名填充它,其中行的值== 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等功能,但不幸的是还没有找到可行的解决方案。

我在R中开发脚本相当陌生,所以如果我的问题不清楚或不易回答,我很抱歉。

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

4 个答案:

答案 0 :(得分:2)

使用which的方法:

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

答案 1 :(得分:1)

我们可以使用max.col来查找逻辑矩阵(df1[-1]=="1+")的列索引。添加1,因为我们只使用第二列。然后,使用names(df1)获取相应的名称

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

答案 2 :(得分:1)

您可以使用apply以及:

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 :(得分:0)

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

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