【问题标题】:Add list of columns above a certain threshold添加高于某个阈值的列列表
【发布时间】:2016-01-14 03:52:32
【问题描述】:

假设我有一个数据框:

df <- data.frame(rbind(c(10,1,5,4), c(6,0,3,10), c(7,1,10,10))) 
colnames(df) <- c("a", "b", "c", "d")


df
a  b  c  d
10 1  5  4
6  0  3 10
7  1 10 10

还有一个数字向量(对应四个列名a,b,c,d)

threshold <- c(7,1,5,8)

我需要将数据框中的每一行与向量进行比较。当数据框中的值达到或超过向量中的值时,我需要返回列名。输出将是:

a   b   c   d   cols
10  1   5   4    a,b,c    #10>7, 1>=1, 5>=5
6   0   3   10   d        #10>8
7   1   10  10   a,b,c,d  ##7>=7, 1>=1, 10>=5, 10>-8

列 cols 可以是一个字符串,简单地列出超出值的列。

有什么聪明的方法可以做到这一点吗?我正在迁移一个旧的 Excel 函数,我可以编写一个循环或其他东西,但我认为几乎必须有更好的方法。

【问题讨论】:

    标签: r


    【解决方案1】:

    您不需要which,所需的输出是逗号分隔值:

    df$cols <- apply(df[-1], 1, function(x) toString(names(df)[-1][x >= threshold]))
    df
      id  a b  c  d       cols
    1 aa 10 1  5  4    a, b, c
    2 bb  6 0  3 10          d
    3 cc  7 1 10 10 a, b, c, d
    

    【讨论】:

      【解决方案2】:

      我们也可以试试

      i1 <- which(df >=threshold[col(df)], arr.ind=TRUE)
      df$cols <- unname(tapply(names(df)[i1[,2]], i1[,1], toString))
      df$cols
      #[1] "a, b, c"    "d"          "a, b, c, d"
      

      【讨论】:

        【解决方案3】:

        你可以试试这个:

        df$cols <- apply(df[, 2:5], 1, function(x) names(df[, 2:5])[which(x >= threshold)])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-26
          • 2013-07-01
          • 2019-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-01
          • 1970-01-01
          相关资源
          最近更新 更多