R根据条件返回列名

时间:2017-02-21 17:59:08

标签: r

对于以下数据框:

DF <- data.frame(Row=c(1,2,3,4,5),`2.04`=c(1,1,0,1,1),`2.05`=c(0,0,0,0,1),
       `2.06`=c(1,0,0,0,1),`2.07`=c(1,0,0,0,1),`2.08`=c(1,1,1,0,0), check.names = F)

我想为每一行返回一个新的向量列名,该列名同时包含(a)相关行中大于0的值; (b)列名称具有满足条件a的所有值的最高值,例如:

DF <- data.frame(Row=c(1,2,3,4,5),'2.04'=c(1,1,0,0,1),'2.05'=c(0,0,0,0,1),
                '2.06'=c(1,0,0,0,1),'2.07'=c(1,0,0,1,1),'2.08'=c(1,1,1,0,0),
                Results=c(2.08,2.08,2.08,2.04,2.07)

因此,对于第2行,列2.04和2.08满足条件(a),并且只有2.08满足条件(b),因为2.08> 2.04。

dplyrdata.table将是首选。

2 个答案:

答案 0 :(得分:3)

你也可以像这样使用max.col

DF$results <- names(DF[-1])[max.col(DF[-1], "last")]
DF
  Row 2.04 2.05 2.06 2.07 2.08 results
1   1    1    0    1    1    1    2.08
2   2    1    0    0    0    1    2.08
3   3    0    0    0    0    1    2.08
4   4    1    0    0    0    0    2.04
5   5    1    1    1    1    0    2.07

max.col返回每行最大值的列位置。它需要第二个参数ties.method,它设置为&#34; last&#34;这里是为了返回每行的最大列位置。这些列位置用于提取[的列名称,然后将其转换为数字并放入向量中。

答案 1 :(得分:2)

我们可以逐行使用apply并获取值大于0的所有列的names并获取max

DF$Results <- apply(DF[-1], 1, function(x) max(names(which(x >0))))

DF
#  Row 2.04 2.05 2.06 2.07 2.08 Results
#1   1    1    0    1    1    1    2.08
#2   2    1    0    0    0    1    2.08
#3   3    0    0    0    0    1    2.08
#4   4    1    0    0    0    0    2.04
#5   5    1    1    1    1    0    2.07