我正在尝试使用 for 循环创建包含一个或多个 NA 值的列名称向量,但没有成功。
hasnas <- c()
for (i in 1:length(data)){
if(sum(is.na(data[,i]))>0){
hasnas <- append(hasnas,names(data[,i]))
}
}
>hasnas
>NULL
真诚地感谢任何帮助。
答案 0 :(得分:2)
几个基本的 R 选项:
#Option 1
hasnas <- names(data)[colSums(is.na(data)) > 0]
#Option 2
hasnas <- names(Filter(function(x) any(is.na(x)), data))
答案 1 :(得分:1)
这不使用循环,而是使用 R 的 apply
函数:
d <- data.frame(a = 1:2, b = c(1, NA), c = c(NA, NA), d = 1:2)
o <- apply(d, 2, function(x) any(is.na(x)))
names(o[sapply(o, isTRUE)])
[1] "b" "c"
答案 2 :(得分:0)
您只需将 names(data[,i])
更改为 names(data)[i]
。查看下面的完整reprex:
data <- iris
data[["Sepal.Length"]][sample(100, 10)] <- NA
data[["Species"]][sample(100, 10)] <- NA
hasnas <- c()
for (i in 1:length(data)) {
if(any(is.na(data[, i]))) {
hasnas <- append(hasnas, names(data)[i])
}
}
hasnas
#> [1] "Sepal.Length" "Species"
由 reprex package (v1.0.0) 于 2021 年 3 月 25 日创建
答案 3 :(得分:0)
有一种简洁(我认为也很优雅)的方法可以通过使用 purrr 来实现这一点
data <- tibble(
a = rep(NA, 10),
b = rnorm(10),
c = rep(NA, 10)
)
正在加载 purrr 包:library(purrr)
names(data)[map_lgl(data, ~any(is.na(.x)))]
[1] "a" "c"