【发布时间】:2015-05-30 09:07:05
【问题描述】:
简而言之:
我想用我的桌子做这个,
说明:
我有一张大桌子,里面有 20,000 x 1,200 件物品。我想删除所有从上到下具有相同值的列。但它不应该更改变量名称(示例中为 V2),以便稍后我可以确定删除了哪个变量。
【问题讨论】:
标签: r
简而言之:
我想用我的桌子做这个,
说明:
我有一张大桌子,里面有 20,000 x 1,200 件物品。我想删除所有从上到下具有相同值的列。但它不应该更改变量名称(示例中为 V2),以便稍后我可以确定删除了哪个变量。
【问题讨论】:
标签: r
只需使用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
【讨论】:
vapply(而不是sapply)时,您必须指定输出预期所在的“模板”。在这种情况下,我们期望@ 987654328@ 返回单个 TRUE 或 FALSE。因此,我们的模板需要一个长度为 1 的逻辑值,我们用logical(1L) 表示(L 在这里表示一个整数值)。
spread 问题。希望以后能解决这个问题。
如果有人尝试使用 dplyr 执行此操作,这是另一种方法:
library(dplyr)
mydf %>% select(where(~n_distinct(.) > 1))
【讨论】:
这里有一个简短的方法:
>Filter(var, mydf)
v1 v2 v4
1 1 5 9
2 2 6 10
3 3 7 11
4 4 8 12
这是可行的,因为零方差被解释为错误。
注意: 不适用于字符类列。
【讨论】:
Filter(function(x) length(unique(x))>1, mydf)
var(PlantGrowth$group)。它可能适用于除字符之外的所有内容。
length(unique 将适用于大多数情况。
使用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")
【讨论】: