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

如何删除R中具有相同值的列,r,R,简而言之: 我想用我的桌子做这个 说明: 我有一张有20000 x 1200件物品的大桌子。我想删除从上到下具有相同值的所有列。但它不应该更改变量名(示例中为V2),以便稍后我可以确定删除了哪个变量 只需使用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

简而言之:

我想用我的桌子做这个

说明:


我有一张有20000 x 1200件物品的大桌子。我想删除从上到下具有相同值的所有列。但它不应该更改变量名(示例中为V2),以便稍后我可以确定删除了哪个变量

只需使用
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
保留所需的列:

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
这里有一条捷径:

>Filter(var, mydf)
  v1 v2 v4
1  1  5  9
2  2  6 10
3  3  7 11
4  4  8 12
这是因为零的方差被解释为false


注意:不适用于字符类列。

使用
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如果有人试图用dplyr执行此操作,这是另一种方法:

库(dplyr)
mydf%>%选择(其中(~length(unique()>1))

@Dev,当您使用
vapply
(与
sapply
相反)时,必须指定预期输出的“模板”。在这种情况下,我们期望
length(unique(x))>1
返回单个
TRUE
FALSE
。因此,我们的模板期望长度为1的逻辑值,我们用
logical(1L)
表示(
L
这里代表一个整数值)。@AnandaMahto今天刚刚看到这篇文章。我学到了更多关于“吸血鬼”的知识,我不经常使用它。顺便说一下,我想感谢你在git上的回复。我正在使用Mac电脑,并且在相当长的一段时间内面临着
spread
问题。希望这个问题能在将来得到解决。+1此方法适用于因子和数值变量!在检查多个级别或方差=0之前,我不再需要担心从数字列中分离因子。这种方法仅适用于数字列。一般来说,它可能是
过滤器(函数(x)长度(唯一(x))>1,mydf)
@akruIt也适用于因子,例如
var(PlantGrowth$group)
。它可能适用于除字符以外的所有情况。@NealFuitz是的,但是
长度(唯一的
将适用于大多数情况。
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")