我需要减少数据集中的行数。为此,我的策略是组中的行数超过 X 观察次数,如果组中的行数超过 X<,则从每个组中随机抽取
行。X
行数
假设如下数据集:
set.seed(123)
n <- 10
df <- data.frame(id = c(1:n),
group = sample(1:3, n, replace = T))
> df
id group
1 1 3
2 2 3
3 3 3
4 4 2
5 5 3
6 6 2
7 7 2
8 8 2
9 9 3
10 10 1
其中 X == 2
。让我们数一数每组的行数。
> table(df$group)
1 2 3
1 4 5
这意味着在最终结果中,我希望在第 1 组中进行 1 次观察,在第 2 组和第 3 组中进行 2 次观察。应随机选择保留在第 2 组和第 3 组中的行。这会将数据的大小从 10 行减少到 5 行。
如何以有效的方式做到这一点?
谢谢!
最佳答案
这是一种按组列分组并在 slice
中创建条件以检查行数 (n()
) 是否大于“X”的方法, 使用 X
对行序列 (row_number()
) 进行采样,否则返回 row_number()
(或者在 X< 的情况下进行采样
是不同的值
library(dplyr)
X <- 2
df %>%
group_by(group) %>%
slice(if(n() >= X) sample(row_number(), X, replace = FALSE) else
sample(row_number())) %>%
ungroup
-输出
# A tibble: 5 × 2
id group
<int> <int>
1 10 1
2 8 2
3 4 2
4 1 3
5 9 3
关于r - 如果组中的行数超过 X 个观察值,则随机抽样 X 个行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71874584/