重新采样可变长度组,使组长度相等(R,dplyr)
Re-sampling groups of variable lengths so that group lengths are equal (R, dplyr)
我有一个数据集,其中各组之间的行数可能不同。我需要在每个组内随机抽样并放回,以便行数等于预定值。
下面我有一个示例 DATA
和所需的 RESULT
table。在此示例中,我需要对每个组进行随机抽样,以便每个 SITE
有 4 行。此外,因为 SITE$A
已经有 4 行,所以不应该重新采样。
请注意 RESULT
table 如何保留 STUFF:STUFF3
各列的数据顺序。我更喜欢使用 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
将显示整个组未修改。
这是结合了 mutate
语句的 @akhmed 代码版本。我必须在 dplyr
中使用 do
函数变得更好。谢谢。
RESULT4 <- group_by(DATA, SITE) %>%
mutate(sampsize = NUMBER - n())%>%
do (sample_n(., size = .$sampsize[1], replace=TRUE )) %>%
select(-sampsize ) %>%
ungroup()
我有一个数据集,其中各组之间的行数可能不同。我需要在每个组内随机抽样并放回,以便行数等于预定值。
下面我有一个示例 DATA
和所需的 RESULT
table。在此示例中,我需要对每个组进行随机抽样,以便每个 SITE
有 4 行。此外,因为 SITE$A
已经有 4 行,所以不应该重新采样。
请注意 RESULT
table 如何保留 STUFF:STUFF3
各列的数据顺序。我更喜欢使用 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
将显示整个组未修改。
这是结合了 mutate
语句的 @akhmed 代码版本。我必须在 dplyr
中使用 do
函数变得更好。谢谢。
RESULT4 <- group_by(DATA, SITE) %>%
mutate(sampsize = NUMBER - n())%>%
do (sample_n(., size = .$sampsize[1], replace=TRUE )) %>%
select(-sampsize ) %>%
ungroup()