【问题标题】:R return column name based on conditionsR根据条件返回列名
【发布时间】:2017-02-21 17:59:08
【问题描述】:

对于以下数据框:

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 将是首选。

【问题讨论】:

    标签: r


    【解决方案1】:

    你也可以像这样使用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,此处设置为“last”,以便返回每行的最大列位置。这些列位置用于提取带有[ 的列名,然后将其转换为数字并放入向量中。

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        • 2015-06-06
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 2021-08-28
        相关资源
        最近更新 更多