如何使用单个值删除数据框列

时间:2012-09-11 03:06:12

标签: r dataframe

假设我在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个值)

我知道我可以手动检查,但实际上我的数据非常大,我想自动化它。有什么想法吗?

3 个答案:

答案 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_distinctuniqueNvar函数替换。

例如

sd