我有一个格式如下的数据表:
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
答案 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"