如果列中的所有值都相同,则从数据框中删除列

时间:2018-04-11 21:07:49

标签: r dataframe

如果数据框具有所有相同的值,那么从数据框中删除列的最有效方法是什么?

这是一个示例df,但我的df超过10 ^ 8列,所以我正在寻找最有效的方法:

df <- data.frame(c(0, 0, 0, 0, 1), c(0, 0, 0, 0, 0), c(1, 1, 1, 0, 1), c(1, 1, 1, 1, 1))

在此示例中,应删除第2列和第4列。

谢谢!

3 个答案:

答案 0 :(得分:2)

基于diff的解决方案可以是:

df[,apply(df,2,function(x)!all(diff(x)==0))]

#    c.0..0..0..0..1. c.1..1..1..0..1.
# 1                0                1
# 2                0                1
# 3                0                1
# 4                0                0
# 5                1                1

答案 1 :(得分:0)

plyr解决方案:

library(plyr)
df <- df[,colwise(function(x) length(unique(x)))(df)>1]

答案 2 :(得分:0)

我们可以使用包中的select_if函数和用户定义的函数来检查每列中的唯一值是否为两个或更多。

library(dplyr)

# Define a function to check if two or more values in a vector
not_unique <- function(vec) length(unique(vec)) > 1

# Use select_if to select the column
df2 <- df %>% select_if(not_unique)

df2
#   c.0..0..0..0..1. c.1..1..1..0..1.
# 1                0                1
# 2                0                1
# 3                0                1
# 4                0                0
# 5                1                1

我们也可以使用基础R的sapply

df[, sapply(df, not_unique)]
#   c.0..0..0..0..1. c.1..1..1..0..1.
# 1                0                1
# 2                0                1
# 3                0                1
# 4                0                0
# 5                1                1