我从R:
中的数据框开始data <- data.frame(Names=c("A", "B", "C", "D"), E1=c(NA, 1, 0, 4), E2=c(3, 0, 0, NA))
Names E1 E2
1 A NA 3
2 B 1 0
3 C 0 0
4 D 4 NA
我的目标是创建一个列表,显示每列的值非零,零或NA的名称。换句话说:
[[1]]
$Nonzero
"B", "D"
$Zero
"C"
$N/A
"A"
[[2]]]
$Nonzero
"A"
$Zero
"B", "C"
$N/A
"D"
到目前为止,我已经写了以下功能:
my.function <- function(x) {
nonzero <- which(x!=0 & !is.na(x))
zero <- which(x==0 & !is.na(x))
na <- which(is.na(x))
rows <- list("Nonzero"=nonzero, "Zero"=zero, "N/A"=na)
return(rows)
}
然后我使用了lapply:
lapply(data[,-1], my.function)
结果如下:
[[1]]
$Nonzero
2, 4
$Zero
3
$N/A
1
[[2]]]
$Nonzero
1
$Zero
2, 3
$N/A
4
所以我已经获得了行号,但现在我无法弄清楚如何从这里获取名称。我的真实数据集有大约50列,所以我肯定需要一些我可以使用lapply的东西,而不是为每一列单独做。建议非常感谢!
编辑:我应该补充一点,我希望此功能可以转移用于其他数据集。因此,将此单个数据集的名称插入到该函数中将不起作用。
答案 0 :(得分:1)
非常快速的解决方法是:
library(magrittr)
my.function <- function(x) {
nonzero <- which(x!=0 & !is.na(x)) %>% data$Names[.]
zero <- which(x==0 & !is.na(x)) %>% data$Names[.]
na <- which(is.na(x)) %>% data$Names[.]
rows <- list("Nonzero"=nonzero, "Zero"=zero, "N/A"=na)
return(rows)
}
然后致电
lapply(data, my.function)[-1]
因为您不希望列&#34;名称&#34;的列表结果。