从数据框中删除一些值为NA的列

时间:2012-09-17 07:04:24

标签: r dataframe na

我有一个数据框,其中一些值是NA。我想删除这些列。

我的data.frame看起来像这样

    v1   v2 
1    1   NA 
2    1    1 
3    2    2 
4    1    1 
5    2    2 
6    1   NA

我试图估算col col并选择列意味着!= NA。我试过这个说法,但是没有用。

data=subset(Itun, select=c(is.na(colMeans(Itun))))

我收到了错误,

  

错误:'x'必须是至少包含两个维度的数组

有人可以给我一些帮助吗?

7 个答案:

答案 0 :(得分:33)

数据:

Itun <- data.frame(v1 = c(1,1,2,1,2,1), v2 = c(NA, 1, 2, 1, 2, NA)) 

这将删除包含至少一个NA的所有列:

Itun[ , colSums(is.na(Itun)) == 0]

另一种方法是使用apply

Itun[ , apply(Itun, 2, function(x) !any(is.na(x)))]

答案 1 :(得分:11)

这是使用dplyr函数select_if()的便捷方式。不合并(!),any()is.na(),这相当于选择不包含任何NA值的所有列。

library(dplyr)
Itun %>%
    select_if(~ !any(is.na(.))

答案 2 :(得分:7)

你可以使用两次转置:

newdf <- t(na.omit(t(df)))

答案 3 :(得分:5)

data[,!apply(is.na(data), 2, any)]

答案 4 :(得分:1)

apply答案相关的基本R方法是

Itun[!unlist(vapply(Itun, anyNA, logical(1)))]
  v1
1  1
2  1
3  2
4  1
5  2
6  1

这里,vapply用于我们在列表上操作,而apply,它不会将对象强制转换为矩阵。此外,由于我们知道输出将是长度为1的逻辑向量,因此我们可以将其提供给vapply,并可能获得一点速度提升。出于同样的原因,我使用anyNA代替any(is.na())

答案 5 :(得分:1)

dplyr包的另一种替代方法是利用Filter函数

Filter(function(x) !any(is.na(x)), Itun)

使用data.table会比较麻烦

setDT(Itun)[,.SD,.SDcols=setdiff((1:ncol(Itun)),
                                which(colSums(is.na(Itun))>0))]

答案 6 :(得分:1)

或者,可以使用select(where(~FUNCTION))

library(dplyr)

(df <- data.frame(x = letters[1:5], y = NA, z = c(1:4, NA)))
#>   x  y  z
#> 1 a NA  1
#> 2 b NA  2
#> 3 c NA  3
#> 4 d NA  4
#> 5 e NA NA

# Remove columns where all values are NA
df %>% 
  select(where(~!all(is.na(.))))
#>   x  z
#> 1 a  1
#> 2 b  2
#> 3 c  3
#> 4 d  4
#> 5 e NA
  
# Remove columns with at least one NA  
df %>% 
  select(where(~!any(is.na(.))))
#>   x
#> 1 a
#> 2 b
#> 3 c
#> 4 d
#> 5 e