添加高于特定阈值的列的列表

时间:2016-01-14 03:52:32

标签: r

说我有一个数据框:

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函数,我可以写一个循环或其他东西,但我认为几乎必须有一个更好的方法。

3 个答案:

答案 0 :(得分:4)

您不需要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

答案 1 :(得分:3)

我们也可以尝试

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"

答案 2 :(得分:2)

你可以试试这个:

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