[英]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.