我有一个这样的数据集:
values Pop1
1 611648 Nafr
2 322513 Nafr
3 381089 Jud
4 16941 Jud
5 21454 Jud
6 658802 Jud我使用命令行汇总这些值:
df %>% group_by(Pop1) %>% summarize(Mean = mean(x = values))这样我就有了Pop1=Nafr和Pop1=Jud的均值。
在总结之前,我想在两个总体(Pop1)中随机抽样相同数量的行(50)。
我找到了sample_n()函数,它很棒。
df %>% group_by(Pop1) %>% sample_n(size=50) %>% summarize(Mean = mean(x = values))但我想运行100次,创建一个大的df,然后进行总结。
有没有办法在上面的命令行中添加一些东西来创建表,其中有100次来自df的50行的采样,添加列bs,对应于100个随机采样。如下所示:
bs values Pop1
1 1 611648 Nafr
2 1 322513 Nafr
3 1 381089 Jud
4 1 16941 Jud
5 1 21454 Jud
6 1 658802 Jud
...
1 100 611648 Nafr
2 100 322513 Nafr
3 100 381089 Jud
4 100 16941 Jud
5 100 21454 Jud
6 100 658802 Jud然后我可以运行new_df %>% group_by(bs, Pop1) %>% summarize(Mean = mean(x = values))来获得我的摘要,但也可以使用该表来绘制曲线图。
谢谢!
发布于 2020-10-23 18:47:16
您可以使用purrr::map_dfr创建将按行绑定的所选样本的data.frame,然后可以使用您提供的命令获取摘要:
purrr::map_dfr(integer(100), ~ df %>% sample_n(size=50), .id="obs") -> new_df
new_df
#> # A tibble: 5,000 x 3
#> obs values Pop1
#> <chr> <int> <fct>
#> 1 1 381089 Jud
#> 2 1 658802 Jud
#> 3 1 381089 Jud
#> 4 1 611648 Nafr
#> 5 1 381089 Jud
#> 6 1 21454 Jud
#> 7 1 611648 Nafr
#> 8 1 381089 Jud
#> 9 1 21454 Jud
#> 10 1 322513 Nafr
#> # … with 4,990 more rows
new_df %>% group_by(obs, Pop1) %>% summarize(Mean = mean(x = values))
#`summarise()` regrouping output by 'obs' (override with `.groups` argument)
# A tibble: 200 x 3
# Groups: obs [100]
obs Pop1 Mean
<chr> <fct> <dbl>
1 1 Jud 261302.
2 1 Nafr 451017.
3 10 Jud 303711.
4 10 Nafr 474689.
5 100 Jud 236533.
6 100 Nafr 492592.
7 11 Jud 279812.
8 11 Nafr 425776.
9 12 Jud 279725.
10 12 Nafr 455960.
# … with 190 more rows数据
read.table(text= "values Pop1
611648 Nafr
322513 Nafr
381089 Jud
16941 Jud
21454 Jud
658802 Jud", header=T)->df
tibble(df[rep(1:6, times=5, each=10),])->df发布于 2020-10-23 18:40:53
可以这样做的一种方法是使用purrr包中的嵌套tibbles和map:
library(tidyverse)
df %>% nest(df = everything()) %>%
slice(rep(1, 100)) %>%
mutate(bs = 1:100) %>%
mutate(df_sum = map(df, ~.x%>% group_by(Pop1) %>%
sample_n(size=50) %>%
summarize(Mean = mean(x = values)))) %>%
unnest(df_sum)或者,如果您只是想要一种将数据堆叠100次的方法,您可以使用slice:
df %>% slice(rep(1:n(), 100)) 发布于 2020-10-23 18:42:53
尝尝这个
library(tidyr)
df %>% expand(bs = 1:100, nesting(values, Pop1)) 输出
# A tibble: 600 x 3
bs values Pop1
<int> <dbl> <chr>
1 1 16941 Jud
2 1 21454 Jud
3 1 322513 Nafr
4 1 381089 Jud
5 1 611648 Nafr
6 1 658802 Jud
7 2 16941 Jud
8 2 21454 Jud
9 2 322513 Nafr
10 2 381089 Jud
# ... with 590 more rows然后,您可以像这样继续您的管道
df %>%
expand(bs = 1:100, nesting(values, Pop1)) %>%
group_by(bs, Pop1) %>%
sample_n(size = 50) %>%
summarize(Mean = mean(x = values))https://stackoverflow.com/questions/64498345
复制相似问题