假设我在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个值)
我知道我可以手动检查,但实际上我的数据非常大,我想自动化它。有什么想法吗?
答案 0 :(得分:11)
Filter
在这里是一个有用的功能。我将仅过滤那些有超过1个唯一值的那些。
即
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
答案 1 :(得分:8)
你可以这样做:
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
答案 2 :(得分:0)
在dplyr
中,我们可以使用n_distinct
计算唯一值,并使用select_if
选择列
library(dplyr)
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
的{{1}}和keep
使用相同的逻辑
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