首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R dplyr:引导或随机采样

R dplyr:引导或随机采样
EN

Stack Overflow用户
提问于 2020-10-23 18:30:40
回答 4查看 174关注 0票数 0

我有一个这样的数据集:

代码语言:javascript
复制
   values  Pop1
1  611648  Nafr
2  322513  Nafr
3  381089  Jud
4   16941  Jud
5   21454  Jud
6  658802  Jud

我使用命令行汇总这些值:

代码语言:javascript
复制
df %>% group_by(Pop1) %>% summarize(Mean = mean(x = values))

这样我就有了Pop1=NafrPop1=Jud的均值。

在总结之前,我想在两个总体(Pop1)中随机抽样相同数量的行(50)。

我找到了sample_n()函数,它很棒。

代码语言:javascript
复制
df %>% group_by(Pop1) %>% sample_n(size=50) %>% summarize(Mean = mean(x = values))

但我想运行100次,创建一个大的df,然后进行总结。

有没有办法在上面的命令行中添加一些东西来创建表,其中有100次来自df的50行的采样,添加列bs,对应于100个随机采样。如下所示:

代码语言:javascript
复制
       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))来获得我的摘要,但也可以使用该表来绘制曲线图。

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2020-10-23 18:47:16

您可以使用purrr::map_dfr创建将按行绑定的所选样本的data.frame,然后可以使用您提供的命令获取摘要:

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2020-10-23 18:40:53

可以这样做的一种方法是使用purrr包中的嵌套tibbles和map

代码语言:javascript
复制
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:

代码语言:javascript
复制
df %>% slice(rep(1:n(), 100)) 
票数 0
EN

Stack Overflow用户

发布于 2020-10-23 18:42:53

尝尝这个

代码语言:javascript
复制
library(tidyr)
df %>% expand(bs = 1:100, nesting(values, Pop1)) 

输出

代码语言:javascript
复制
# 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

然后,您可以像这样继续您的管道

代码语言:javascript
复制
df %>% 
  expand(bs = 1:100, nesting(values, Pop1)) %>% 
  group_by(bs, Pop1) %>% 
  sample_n(size = 50) %>%
  summarize(Mean = mean(x = values))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64498345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档