删除有或没有NA的常量列

COL*_*OLO 10 r data.table

我试图让许多lm模型在函数中工作,我需要从data.table中自动删除常量列.因此,我想只保留具有两个或更多唯一值的列,不包括NA计数.

我尝试了在SO上找到的几种方法,但我仍然无法删除具有两个值的列:常量和NA.

我可重现的代码:

library(data.table)
df <- data.table(x=c(1,2,3,NA,5), y=c(1,1,NA,NA,NA),z=c(NA,NA,NA,NA,NA), 
d=c(2,2,2,2,2))

> df
    x  y  z d
1:  1  1 NA 2
2:  2  1 NA 2
3:  3 NA NA 2
4: NA NA NA 2
5:  5 NA NA 2
Run Code Online (Sandbox Code Playgroud)

我的目的是删除列y,z和d,因为它们是常量,包括y,当NA省略s 时只有一个唯一值.

我试过这个:

same <- sapply(df, function(.col){ all(is.na(.col))  || all(.col[1L] == .col)})
df1 <- df[ , !same, with = FALSE]


> df1
    x  y
1:  1  1
2:  2  1
3:  3 NA
4: NA NA
5:  5 NA
Run Code Online (Sandbox Code Playgroud)

如上所见,'y'仍在那里......有什么帮助吗?

Hen*_*rik 8

因为你有data.table,你可以使用uniqueN它的na.rm论点:

df[ , lapply(.SD, function(v) if(uniqueN(v, na.rm = TRUE) > 1) v)]
#     x
# 1:  1
# 2:  2
# 3:  3
# 4: NA
# 5:  5
Run Code Online (Sandbox Code Playgroud)

base另一种选择可能是Filter(function(x) length(unique(x[!is.na(x)])) > 1, df)