如何创建“for”循环以创建包含 R 中 NA 的列向量?

时间:2021-03-26 01:36:50

标签: r

我正在尝试使用 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

真诚地感谢任何帮助。

4 个答案:

答案 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"
相关问题