使用 R 中数据框的均值和标准差数据生成单独的数据分布

Generate individual data distributions using mean and standard deviation data from a data frame in R

我在 R 中有一个 data.frame,包含几个分类变量,每个都有自己的均值和标准差。我想为由这些值定义的每个分类变量从正态数据分布生成值,并为每个离散分类变量生成单独的 data.frames

这是一些虚拟数据

dummy_data <- data.frame(VARIABLE = LETTERS[seq( from = 1, to = 10 )],
                         MEAN = runif(10, 5, 10), SD = runif(10, 1, 3))

dummy_data

   VARIABLE     MEAN       SD
1         A 6.278751 1.937093
2         B 6.384247 2.487678
3         C 9.017496 2.003202
4         D 5.125994 1.829517
5         E 9.525213 1.914513
6         F 9.004893 2.734934
7         G 9.780757 2.511341
8         H 5.372160 1.510281
9         I 6.240331 2.796826
10        J 8.478280 2.325139

从这里我想做的是为每一行生成单独的 data.frames,每个 data.frame 包含基于 MEANSD 列。

因此,例如,我有一个单独的 data.frame 包含....

A <- subset(dummy_data, VARIABLE == 'A')
A <- data.frame(rnorm(20,  A$MEAN, A$SD))

A

   rnorm.20..A.MEAN..A.SD.
1                 5.131331
2                 9.388104
3                 8.909453
4                 5.813257
5                 5.353137
6                 7.598521
7                 2.693924
8                 5.425703
9                 8.939687
10                9.148066
11                4.528936
12                7.576479
13                8.207456
14                6.838258
15                6.972061
16                7.824283
17                6.283434
18                4.503815
19                2.133388
20                7.472886

我正在处理的真实数据比十行大得多,所以我不想对整个数据进行子集化以生成单个数据 data.frames 如果我可以的话。

提前致谢

你可以把所有东西都放到一个列表中,然后return把列表中的所有元素放到全局环境中(如果需要,或者保留在列表中):

set.seed(123)
dummy_data <- data.frame(VARIABLE = LETTERS[seq( from = 1, to = 10 )],
                         MEAN = runif(10, 5, 10), SD = runif(10, 1, 3))

# put all the values into a list
list_dist <- vector(mode = "list", length = nrow(dummy_data))
for(i in 1:nrow(dummy_data)){
  list_dist[[i]] <- data.frame(values = rnorm(20, dummy_data[i,2], dummy_data[i,3]))
}
# name the list elements 
names(list_dist) <- dummy_data$VARIABLE

# or more detailed names, for instance, 
# names(list_dist) <- paste0(dummy_data$VARIABLE, "_Distribution")

#return all list values to the global environment
list2env(list_dist,globalenv())

使用 dplyr 的解决方案怎么样?:

library(dplyr)

#A dataframe containing all the information
Huge_df <- dummy_data %>% group_by(VARIABLE) %>% summarise(SIMULATED = rnorm(20, MEAN, SD))

#You can then split the dataframe if needed:
Splitted <- split.data.frame(Huge_df, "VARIABLE")

如果您随后需要保存每个单独的数据帧,或对它们做其他事情,您可以随时取消列出 Splitted 对象

使用data.table:

library(data.table)
result     <- setDT(dummy_data)[, .(sample=rnorm(20, mean=MEAN, sd=SD)), by=.(VARIABLE)]
list.of.df <- split(result, result$VARIABLE)