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

20

简而言之:

我想要对我的表格进行操作,

输入图像描述

解释:

我有一个包含20,000行和1,200列的大表格。我想要移除所有从上到下所有数值相同的列。但是它不应该改变变量名称(例如示例中的V2),以便稍后我可以确定哪些列被删除了。

4个回答

27

使用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
@Dev,当你使用vapply(而不是sapply)时,你必须指定预期输出的“模板”。在这种情况下,我们期望length(unique(x))>1返回单个TRUEFALSE。因此,我们的模板是期望一个长度为1的逻辑值,并用logical(1L)表示(这里的“L”代表整数值)。 - A5C1D2H2I1M1N2O1R2T1
@AnandaMahto,今天刚看到这篇文章。我学到了更多关于“vapply”的知识,这是我不常用的函数。顺便说一句,感谢你在git上的回复。我使用的是Mac,长时间面临着“spread”问题。希望这个问题能在未来得到解决。 - jazzurro
+1 这种方法适用于因子和数值变量!我再也不用担心在检查多个水平或方差 = 0之前将因子与数字列分开了。 - RobertF

19

如果有人想使用dplyr,这是另一种实现方法:

library(dplyr)
mydf %>% select(where(~n_distinct(.) > 1))

12

这是一个简短的方法:

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

这是因为方差为零被解释为假。

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


1
这种方法仅适用于数字列。为了更通用,可以使用Filter(function(x) length(unique(x))>1, mydf) - akrun
@akru它也适用于因子,例如var(PlantGrowth$group)。除了字符以外,它可能适用于所有内容。 - Neal Fultz
1
@NealFuitz 是的,但在大多数情况下 length(unique 会更好。 - akrun

4
使用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")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接