如何删除R中具有相同值的列

时间:2015-05-30 09:07:06

标签: r

简而言之:

我想用我的桌子来做这件事,

enter image description here

解释

我有20000 x 1,200件物品的大桌子。我想从顶部到底部删除所有具有相同值的列。但它不应该更改变量名称(示例中的V2),以便稍后我可以找出它们被删除的那个。

4 个答案:

答案 0 :(得分:16)

只需使用vapply查看并检查每列中有多少唯一值:

示例数据:

mydf <- data.frame(v1 = 1:4, v2 = 5:8,
                   v3 = 2, v4 = 9:12, v5 = 1)
mydf
##   v1 v2 v3 v4 v5
## 1  1  5  2  9  1
## 2  2  6  2 10  1
## 3  3  7  2 11  1
## 4  4  8  2 12  1

我们将使用vapply做什么:

vapply(mydf, function(x) length(unique(x)) > 1, logical(1L))
#    v1    v2    v3    v4    v5 
#  TRUE  TRUE FALSE  TRUE FALSE 

保留所需的列:

mydf[vapply(mydf, function(x) length(unique(x)) > 1, logical(1L))]
#   v1 v2 v4
# 1  1  5  9
# 2  2  6 10
# 3  3  7 11
# 4  4  8 12

答案 1 :(得分:7)

这是一个简短的方法:

>Filter(var, mydf)
  v1 v2 v4
1  1  5  9
2  2  6 10
3  3  7 11
4  4  8 12

这是有效的,因为零的方差被解释为假。

答案 2 :(得分:2)

使用colSums

df[colSums(df[1,][col(df)]!=df)!=0]
#  V1 V3 V4
#1  1  3  1
#2  4  4  2
#3  2  3  3
#4  5  3  3

数据

df <- structure(list(V1 = c(1, 4, 2, 5), V2 = c(2, 2, 2, 2), V3 = c(3, 
4, 3, 3), V4 = c(1, 2, 3, 3)), .Names = c("V1", "V2", "V3", "V4"
), row.names = c(NA, -4L), class = "data.frame")

答案 3 :(得分:2)

万一有人尝试使用dplyr进行此操作,这是另一种方法:

library(dplyr)
mydf %>% select_if(~ length(unique(.)) > 1)