[英]How to randomly remove rows in dataframe but for a specific subgroup only (with dplyr::sample_n?)
在一个特定的专栏中,我有几个类别。 我想仅在一个类别中随机稀释/稀释/删除一些行。 我已经看到sample_n
与group_by
,但它的size
参数适用于为分组变量中的每个类别删除相同数量的行。 我想为每个组指定不同的size
。
其次,我希望“就地”执行此操作,这意味着我希望它返回相同的原始数据帧,只是现在我试图“稀释”的特定类别中的行将减少。
library(tidyverse)
set.seed(123)
df <-
tibble(
color = sample(c("red", "blue", "yellow", "green", "brown"), size = 1000, replace = T),
value = sample(0:750, size = 1000, replace = T)
)
df
## # A tibble: 1,000 x 2
## color value
## <chr> <int>
## 1 yellow 251
## 2 yellow 389
## 3 blue 742
## 4 blue 227
## 5 yellow 505
## 6 brown 47
## 7 green 381
## 8 red 667
## 9 blue 195
## 10 yellow 680
## # ... with 990 more rows
按颜色统计时,我看到:
df %>% count(color)
color n
<chr> <int>
1 blue 204
2 brown 202
3 green 191
4 red 203
5 yellow 200
现在假设我只想减少red
的行数。 假设我只需要10
行color == red
。 显然,简单地使用sample_n
并不能让我到达那里:
df %>%
group_by(color) %>%
sample_n(10) %>%
count(color)
color n
<chr> <int>
1 blue 10
2 brown 10
3 green 10
4 red 10
5 yellow 10
如何指定只有color == "red"
将有10
行而其他颜色保持不变?
我见过一些类似的问题( 比如这个),但无法根据我的情况调整答案。
我们可以编写一个函数来filter
特定的颜色,对它们进行采样并将它们与原始数据绑定
library(dplyr)
sample_for_color <- function(data, col_to_change, n) {
data %>%
filter(color %in% col_to_change) %>%
group_by(color) %>%
slice_sample(n = n) %>%
ungroup %>%
bind_rows(data %>% filter(!color %in% col_to_change))
}
new_df <- df %>% sample_for_color('red', 10)
new_df %>% count(color)
# color n
# <chr> <int>
#1 blue 204
#2 brown 202
#3 green 191
#4 red 10
#5 yellow 200
new_df <- df %>% sample_for_color(c('red', 'blue'), 10)
new_df %>% count(color)
# color n
# <chr> <int>
#1 blue 10
#2 brown 202
#3 green 191
#4 red 10
#5 yellow 200
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.