簡體   English   中英

如何隨機刪除數據框中的行但僅針對特定子組(使用 dplyr::sample_n?)

[英]How to randomly remove rows in dataframe but for a specific subgroup only (with dplyr::sample_n?)

在一個特定的專欄中,我有幾個類別。 我想僅在一個類別中隨機稀釋/稀釋/刪除一些行。 我已經看到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的行數。 假設我只需要10color == 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM