删除带有或不带有NA的常量列

标签 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

我的意图是删除列y,z和d,因为它们是恒定的,包括当省略NA s时仅具有一个唯一值的y。

我尝试了这个:
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

如图所示,“y”仍然存在...
有什么帮助吗?

最佳答案

因为您有一个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
base替代品可以是Filter(function(x) length(unique(x[!is.na(x)])) > 1, df)

关于删除带有或不带有NA的常量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253732/

相关文章:

r - 如何在R中生成bin频率表?

r - 有没有一种方法可以在数据框中绑定(bind)不同数量的行?

Java, rJava 安装在 AWS EC2 for R (xlsx and other packages)

r - 无法运行 glmnet() R 包 : "could not find function "lengths""

r - data.table:是否可以合并 .SD 并按组返回一个新的 'sub data table'?

r - 在 R 中创建一个按 ID 分组的计数器变量,该变量有条件地重置

r 中参数数量可变的回归函数

r - 在数据帧: index in group (not unique between groups)中创建一个新列

r - 如何根据 TOOL 列中的不同值在 ITEM 上使用多个分隔符?

r 表示整个数据的数据更新列的子集