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