[英]Re-sampling groups of variable lengths so that group lengths are equal (R, dplyr)
我有一個數據集,其中組之間的行數可以變化。 我需要在每個組中隨機進行替換采樣,以使行數等於預定值。
下面我有一個示例DATA
和所需的RESULT
表。 在這個例子中,我需要隨機抽樣每個組,以便每個SITE
有4行。 此外,由於SITE$A
已有4行,因此不應對其進行重新采樣。
請注意RESULT
表如何保留STUFF:STUFF3
列中的數據順序。 我更喜歡使用dplyr
的答案,因為我廣泛使用這個包,但我對其他解決方案dplyr
。
NUMBER = 4
DATA = data.frame(SITE = c("A","A","A","A","B","B","B","C","C"),
STUFF = c(1, 2, 30, 40, 100, 200, 300, 5000, 6000),
STUFF2 = c(2, 4, 60, 80, 200, 400, 600, 10000, 12000),
STUFF3 = c(4, 8, 120, 160, 400, 800, 1200, 20000, 24000))
RESULT = data.frame(SITE = c("B","C","C"),
STUFF = c(200, 5000, 5000),
STUFF2 = c(400, 10000, 10000),
STUFF3 = c(800, 20000, 20000))
我已嘗試過以下代碼的各種迭代......但沒有成功。 提前致謝。
RESULT = group_by(DATA, SITE)%>%
sample_n(NUMBER - length(.), replace = TRUE)
如果我正確地理解了這個問題,那么RESULT
就是DATA
的一種補充數據幀,例如當它們組合在一起時,每組會產生4行。
NUMBER <- 4
set.seed(1234)
RESULT2 <- DATA %>%
group_by(SITE) %>%
mutate(n = n(),
sampsize = as.numeric( ifelse(n>=NUMBER,0,NUMBER-n)) ) %>%
do( sample_n(., size=.$sampsize[1], replace=TRUE ) ) %>%
select( -n, -sampsize ) %>%
ungroup()
RESULT2
產生這個:
Source: local data frame [3 x 4]
SITE STUFF STUFF2 STUFF3
1 B 100 200 400
2 C 6000 12000 24000
3 C 6000 12000 24000
如果需要完整的數據集(將DATA
和RESULT
成一個具有特定排序要求的data.frame),則可以使用以下內容:
NUMBER <- 4
set.seed(1234)
RESULT3 <- DATA %>%
group_by(SITE) %>%
mutate(n = n(),
sampsize = as.numeric( ifelse(n>=NUMBER,0,NUMBER-n)) ) %>%
do( rbind(.,sample_n(., size=.$sampsize[1], replace=TRUE )) ) %>%
select( -n, -sampsize ) %>%
ungroup()
RESULT3
產生這個:
Source: local data frame [12 x 4]
SITE STUFF STUFF2 STUFF3
1 A 1 2 4
2 A 2 4 8
3 A 30 60 120
4 A 40 80 160
5 B 100 200 400
6 B 200 400 800
7 B 300 600 1200
8 B 100 200 400
9 C 5000 10000 20000
10 C 6000 12000 24000
11 C 6000 12000 24000
12 C 6000 12000 24000
請注意,如果NUMBER
小於組中的記錄數,則RESULT3
將顯示未修改的整個組。
這是@akhmed代碼的一個版本,它結合了mutate
語句。 使用dplyr
的do
函數我會變得更好。 謝謝。
RESULT4 <- group_by(DATA, SITE) %>%
mutate(sampsize = NUMBER - n())%>%
do (sample_n(., size = .$sampsize[1], replace=TRUE )) %>%
select(-sampsize ) %>%
ungroup()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.