35

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

我的 data.frame 看起来像这样

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

我试图估计 col 均值并选择列均值!= NA。我试过这个说法,它不起作用。

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

我有一个错误,

错误:“x”必须是至少二维的数组

谁能给我一些帮助?

4

7 回答 7

62

数据:

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)))]
于 2012-09-17T07:25:54.483 回答
33

这是使用该dplyr功能的便捷方法select_if()。组合 not ( !)any()is.na(),相当于选择所有不包含任何 NA 值的列。

library(dplyr)
Itun %>%
    select_if(~ !any(is.na(.)))
于 2017-10-27T16:48:34.910 回答
11

您可以使用转置两次:

newdf <- t(na.omit(t(df)))
于 2016-04-01T19:13:16.783 回答
9

或者,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
于 2020-09-04T17:28:00.403 回答
6
data[,!apply(is.na(data), 2, any)]
于 2012-09-17T07:27:49.690 回答
2

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并有可能获得一点速度提升。出于同样的原因,我使用anyNAany(is.na()).

于 2017-02-03T19:30:30.867 回答
2

该软件包的另一种选择dplyr是使用该Filter功能

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

withdata.table会更麻烦一些

setDT(Itun)[,.SD,.SDcols=setdiff((1:ncol(Itun)),
                                which(colSums(is.na(Itun))>0))]
于 2019-07-15T15:44:50.860 回答