简而言之:
我想要对我的表格进行操作,
解释:
我有一个包含20,000行和1,200列的大表格。我想要移除所有从上到下所有数值相同的列。但是它不应该改变变量名称(例如示例中的V2),以便稍后我可以确定哪些列被删除了。
简而言之:
我想要对我的表格进行操作,
解释:
我有一个包含20,000行和1,200列的大表格。我想要移除所有从上到下所有数值相同的列。但是它不应该改变变量名称(例如示例中的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
我们将使用 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
如果有人想使用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)
。 - akrunvar(PlantGrowth$group)
。除了字符以外,它可能适用于所有内容。 - Neal Fultzlength(unique
会更好。 - akruncolSums
函数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")
vapply
(而不是sapply
)时,你必须指定预期输出的“模板”。在这种情况下,我们期望length(unique(x))>1
返回单个TRUE
或FALSE
。因此,我们的模板是期望一个长度为1的逻辑值,并用logical(1L)
表示(这里的“L”代表整数值)。 - A5C1D2H2I1M1N2O1R2T1