我正在使用data.frame:
data.frame("A"=c(NA,5,NA,NA,NA),
"B"=c(1,2,3,4,NA),
"C"=c(NA,NA,NA,2,3),
"D"=c(NA,NA,NA,7,NA))
Run Code Online (Sandbox Code Playgroud)
这提供了以下形式的data.frame:
A B C D
1 NA 1 NA NA
2 5 2 NA NA
3 NA 3 NA NA
4 NA 4 2 7
5 NA NA 3 NA
Run Code Online (Sandbox Code Playgroud)
我的目的是检查data.frame的每一行,如果有一个值大于特定的值(让我们假设为2),并获得列的名称.
所需的输出(值大于2)应为:
for row 1 of the data.frame
x[1,]: c()
for row 2
x[2,]: c("A")
for row3
x[3,]: c("B")
for row4
x[4,]: c("B","D")
and for row5 of the data.frame
x[5,]: c("C")
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
你可以使用which:
lapply(apply(dat, 1, function(x)which(x>2)), names)
Run Code Online (Sandbox Code Playgroud)
同dat为你的数据帧.
[[1]]
character(0)
[[2]]
[1] "A"
[[3]]
[1] "B"
[[4]]
[1] "B" "D"
[[5]]
[1] "C"
Run Code Online (Sandbox Code Playgroud)
编辑 flodel建议的更短版本:
lapply(apply(dat > 2, 1, which), names)
Run Code Online (Sandbox Code Playgroud)
编辑:(来自Arun)
首先,没有必要lapply和apply.你可以得到同样的apply:
apply(dat > 2, 1, function(x) names(which(x)))
Run Code Online (Sandbox Code Playgroud)
但是,使用applyon data.frame会将其强制转换为矩阵,如果data.frame很大,这可能并不明智.