首页 > 解决方案 > 从另一个数据帧在 dplyr 中创建模拟数据帧

问题描述

假设我有以下试点数据摘要:

pilot_data = read.table(text = "pairing male dv_mean dv_sd
AA  0   1.4377551   11.99576    
AA  1   0.1745918   10.03553    
AB  0   12.6574286  17.76540    
AB  1   9.5337037   13.92486    
BA  0   8.8971111   16.49538    
BA  1   8.8706557   17.13532    
BB  0   1.6339286   12.72830    
BB  1   -0.1433333  13.68828", header = T)

我想dplyr为每个pairing, male组合创建一个模拟数据集,该数据集与该单元格具有相同的均值和标准差。因此,例如,如果我想为每个pairing, male组合设置 300 行,我会执行以下操作:

tester = pilot_data %>% group_by(pairing, male) %>%
  mutate(simulated_data = rnorm(mean = dv_mean, sd = dv_sd, n = 300))

除非由于回收错误,这显然不起作用。我可以使用 for 循环来执行此操作并一遍又一遍地将数据集附加到自身,但我正在尝试学习如何在 dplyr 链中执行此操作。

实现这一目标的最佳方法是什么?

标签: rdplyr

解决方案


我们可以使用summarise而不是mutateassummarise可以每组返回多于 1 行,而mutate严格返回与length原始行数相同的行

 library(dplyr)
 pilot_data %>% 
     group_by(pairing, male) %>% 
     summarise(simulated_data = rnorm(mean = dv_mean, 
        sd = dv_sd, n = 300), .groups = 'drop')

注意:此外,每组的行数都是 1。因此,它之所以有效,是因为 ,rnorm需要单个值meansd


或者另一种选择是使用rowwise,返回一list列,然后unnest(如果组有重复的行)

library(tidyr)
pilot_data %>%
   rowwise %>%
   mutate(simulated_data = list(rnorm(mean = dv_mean, sd = dv_sd,
         n = 300))) %>%
   unnest(c(simulated_data))

推荐阅读