我有一个数据框,其中一些值是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'必须是至少包含两个维度的数组
有人可以给我一些帮助吗?
答案 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