从另一个数据帧在dplyr中创建模拟数据帧

从另一个数据帧在dplyr中创建模拟数据帧,r,dplyr,R,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

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

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
中为每个
配对的男性组合创建一个模拟数据集,该组合与该单元格具有相同的平均值和标准偏差。因此,例如,如果我想为每个
配对、男性组合有300行,我会这样做:

tester = pilot_data %>% group_by(pairing, male) %>%
  mutate(simulated_data = rnorm(mean = dv_mean, sd = dv_sd, n = 300))
但由于回收错误,这显然不起作用。我可以使用for循环来实现这一点,并将数据集一次又一次地附加到自身,但我正在尝试学习如何在dplyr链中实现这一点


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

我们可以使用
摘要
而不是
变异
,因为
摘要
可以返回每组超过1行,而
变异
严格要求返回与原始行数相同的
长度

 library(dplyr)
 pilot_data %>% 
     group_by(pairing, male) %>% 
     summarise(simulated_data = rnorm(mean = dv_mean, 
        sd = dv_sd, n = 300), .groups = 'drop')
注意:另外,每组的行数都是1。因此,它之所以有效,是因为
rnorm
要求
mean
sd


或者另一个选项是使用
行方式
,返回
列表
列,然后返回
unest
(以防组中存在重复的行)


我们可以使用
summary
而不是
mutate
,因为
summary
可以返回每组超过1行,而
mutate
严格要求返回与原始行数相同的
长度

 library(dplyr)
 pilot_data %>% 
     group_by(pairing, male) %>% 
     summarise(simulated_data = rnorm(mean = dv_mean, 
        sd = dv_sd, n = 300), .groups = 'drop')
注意:另外,每组的行数都是1。因此,它之所以有效,是因为
rnorm
要求
mean
sd


或者另一个选项是使用
行方式
,返回
列表
列,然后返回
unest
(以防组中存在重复的行)


这是一个
数据表
选项

> setDT(pilot_data)[, .(simulated_data = rnorm(300, dv_mean, dv_sd)), .(pairing, male)]
      pairing male simulated_data
   1:      AA    0     -11.068416
   2:      AA    0      -4.925878
   3:      AA    0     -11.044629
   4:      AA    0      -7.946300
   5:      AA    0       3.352702
  ---
2396:      BB    1       8.966713
2397:      BB    1     -14.925273
2398:      BB    1     -11.957720
2399:      BB    1      17.335359
2400:      BB    1      17.824735

这是一个
数据表
选项

> setDT(pilot_data)[, .(simulated_data = rnorm(300, dv_mean, dv_sd)), .(pairing, male)]
      pairing male simulated_data
   1:      AA    0     -11.068416
   2:      AA    0      -4.925878
   3:      AA    0     -11.044629
   4:      AA    0      -7.946300
   5:      AA    0       3.352702
  ---
2396:      BB    1       8.966713
2397:      BB    1     -14.925273
2398:      BB    1     -11.957720
2399:      BB    1      17.335359
2400:      BB    1      17.824735

@别担心,我的朋友!我只想为这个问题做点贡献:)@akrun别担心,我的朋友!我只想对这个问题做点贡献:)