簡體   English   中英

dplyr sample_n通過一個變量通過另一個變量

[英]dplyr sample_n by one variable through another one

我有一個帶有“分組”可變season和另一個可變year的數據框,每個月重復一次。

df <- data.frame(month = as.character(sapply(month.name,function(x)rep(x,4))),
                  season = c(rep("winter",8),rep("spring",12),rep("summer",12),rep("autumn",12),rep("winter",4)), 
                  year = rep(2021:2024,12))

我想使用dplyr::sample_n或類似的方法在每個季節的數據框中選擇2個月,並在所有年份中保留相同的月份,例如:

     month        season     year
1     January     winter     2021
2     January     winter     2022
3     January     winter     2023
4     January     winter     2024
5     February    winter     2021
6     February    winter     2022
7     February    winter     2023
8     February    winter     2024
9     March       spring     2021
10    March       spring     2022
11    March       spring     2023
12    March       spring     2024
13    May         spring     2021
14    May         spring     2022
15    May         spring     2023
16    May         spring     2024
17    June        summer     2021
18    June        summer     2022
19    June        summer     2023
20    June        summer     2024
21    July        summer     2021
22    July        summer     2022
23    July        summer     2023
24    July        summer     2024
25    October     autumn     2021
26    October     autumn     2022
27    October     autumn     2023
28    October     autumn     2024
29    November    autumn     2021
30    November    autumn     2022
31    November    autumn     2023
32    November    autumn     2024

我無法使df %>% group_by(season,year) %>% sample_n(2)因為它每年選擇不同的月份。

謝謝!

我們可以從month隨機sample 2個值,然后按組filter它們。

library(dplyr)

df %>%
  group_by(season) %>%
  filter(month %in% sample(unique(month),2))


#   month    season  year
#   <chr>    <chr>  <int>
# 1 January  winter  2021
# 2 January  winter  2022
# 3 January  winter  2023
# 4 January  winter  2024
# 5 February winter  2021
# 6 February winter  2022
# 7 February winter  2023
# 8 February winter  2024
# 9 March    spring  2021
#10 March    spring  2022
# … with 22 more rows

如果對於某些組,少於2個unique值,我們可以在要sample的組中的2個和唯一值之間選擇min

df %>%
  group_by(season) %>%
  filter(month %in% sample(unique(month),min(2, n_distinct(month))))

對基數R使用相同的邏輯,我們可以使用ave

df[as.logical(with(df, ave(month, season, 
             FUN = function(x) x %in% sample(unique(x),2)))), ]

使用slice的選項

library(dplyr)
df %>% 
   group_by(season) %>% 
    slice(which(!is.na(match(month, sample(unique(month), 2)))))
# A tibble: 32 x 3
# Groups:   season [4]
#   month    season  year
#   <fct>    <fct>  <int>
# 1 October  autumn  2021
# 2 October  autumn  2022
# 3 October  autumn  2023
# 4 October  autumn  2024
# 5 November autumn  2021
# 6 November autumn  2022
# 7 November autumn  2023
# 8 November autumn  2024
# 9 April    spring  2021
#10 April    spring  2022
# … with 22 more rows

或使用base R

by(df, df$season, FUN = function(x) subset(x, month %in% sample(unique(month), 2 )))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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