假设我在 R 中有以下数据框:
df1 <- data.frame(Item_Name = c("test1","test2","test3"), D_1=c(1,0,1),
D_2=c(1,1,1), D_3=c(11,3,1))
我想创建一个函数来删除没有差异的列(例如,在这种情况下,它会删除列D_2
,因为它只有 1 个值)
我知道我可以手动检查它,但实际上我的数据非常大,我想自动化它。任何想法?
Filter
在这里是一个有用的功能。我将只过滤那些有超过 1 个唯一值的。
IE
Filter(function(x)(length(unique(x))>1), df1)
## Item_Name D_1 D_3
## 1 test1 1 11
## 2 test2 0 3
## 3 test3 1 1
你可以做:
df1[c(TRUE, lapply(df1[-1], var, na.rm = TRUE) != 0)]
# Item_Name D_1 D_3
# 1 test1 1 11
# 2 test2 0 3
# 3 test3 1 1
这篇lapply
文章告诉你哪些变量有一些差异:
lapply(df1[-1], var, na.rm = TRUE) != 0
# D_1 D_2 D_3
# TRUE FALSE TRUE
在dplyr
中,我们可以使用n_distinct
来计算唯一值并select_if
选择列
library(dplyr)
df1 %>% select(where(~n_distinct(.) > 1))
#For dplyr < 1.0.0
#df1 %>% select_if(~n_distinct(.) > 1)
# Item_Name D_1 D_3
#1 test1 1 11
#2 test2 0 3
#3 test3 1 1
我们可以使用与purrr
'skeep
和相同的逻辑discard
purrr::keep(df1, ~n_distinct(.) > 1)
purrr::discard(df1, ~n_distinct(.) == 1)
除了data.table
这样做的方式可能是
library(data.table)
setDT(df1)
df1[, lapply(df1, uniqueN) > 1, with = FALSE]
或者这可能更聪明/更好
df1[, .SD, .SDcols=lapply(df1, uniqueN) > 1]
在上述所有方法中,您可以在仅对数字列进行子集化后替换n_distinct
/或函数。uniqueN
var
sd
例如,
df1[-1] %>% select_if(~sd(.) != 0)