假设以下数据框有 20 行 3 列:
set.seed(123)
df1 <-
data.frame(
x = sample(1:6, 20, replace = T),
y = sample(1:6, 20, replace = T),
z = sample(1:6, 20, replace = T)
)
df1
x y z
1 3 1 4
2 6 5 5
3 3 3 5
4 2 2 3
5 2 2 6
6 6 1 1
7 3 6 2
8 5 3 5
9 4 4 5
10 6 6 4
11 6 1 5
12 1 3 2
13 2 5 1
14 3 4 1
15 5 2 3
16 3 5 1
17 3 1 6
18 1 1 5
19 4 2 1
20 1 3 2
我想编写一个函数来识别指定标量或向量出现在指定阈值或以上的列。然后,我希望将该函数与 dplyr 中的
select(where())
一起使用来删除满足条件的列。
对于给定的数据框,标量
6
在“x”列中出现四次(或 0.2%),在“y”和“z”列中出现两次(0.1%)。如果指定的标量为 6
并且阈值至少为 0.2%
,则“x”将返回 TRUE
,“y”和“z”将返回 FALSE
。然后“x”列将被删除,留下以下内容:
y z
1 1 4
2 5 5
3 3 5
4 2 3
5 2 6
6 1 1
7 6 2
8 3 5
9 4 5
10 6 4
11 1 5
12 3 2
13 5 1
14 4 1
15 2 3
16 5 1
17 1 6
18 1 5
19 2 1
20 3 2
我找不到关于此的特定于 R 的线程,但有几个 Python 线程处理类似的问题,即这个 如果列中重复值超过 55%,如何删除列?
我尝试转换代码,但似乎没有产生所需的结果,
df_count
返回了一个我不明白的奇怪计数。
drop_columns <- c()
drop_threshold <- 0.2
for (cols in colnames(df1)) {
df_count <- as.data.frame(table(df1[[cols]]))
colnames(df_count) <- c("value", "count")
df_count$drop_percentage <- df_count$count / nrow(df1)
df_count$drop_criterion <- df_count$drop_percentage >= drop_threshold
if (any(df_count$drop_criterion)) {
drop_columns <- c(drop_columns, cols)
}
}
有人知道如何去做吗?先谢谢你了
类似这样的:
# Filter df1 columns where % of value count < 0.2
df2 <- df1[, colMeans(df1 == 6) < 0.2]
df2
# y z
# 1 1 4
# 2 5 5
# 3 3 5
# 4 2 3
# 5 2 6
# 6 1 1
# 7 6 2
# 8 3 5
# 9 4 5
# 10 6 4
# 11 1 5
# 12 3 2
# 13 5 1
# 14 4 1
# 15 2 3
# 16 5 1
# 17 1 6
# 18 1 5
# 19 2 1
# 20 3 2