【问题标题】:How to randomly remove rows in dataframe but for a specific subgroup only (with dplyr::sample_n?)如何随机删除数据框中的行,但仅针对特定子组(使用 dplyr::sample_n?)
【发布时间】:2020-09-29 08:00:45
【问题描述】:

在特定的列中,我有几个类别。我想随机稀释/稀释/删除一些行仅在一个类别中。我见过sample_ngroup_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 行,而其他颜色保持不变?

我看到了一些类似的问题 (like this one),但无法根据我的情况调整答案。

【问题讨论】:

    标签: r dplyr subset


    【解决方案1】:

    我们可以为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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-14
      • 2018-01-29
      • 2019-09-04
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      相关资源
      最近更新 更多