根据其他列返回第一列值的函数?

时间:2018-03-15 16:57:47

标签: r lapply

我从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的东西,而不是为每一列单独做。建议非常感谢!

编辑:我应该补充一点,我希望此功能可以转移用于其他数据集。因此,将此单个数据集的名称插入到该函数中将不起作用。

1 个答案:

答案 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;的列表结果。