代码之家  ›  专栏  ›  技术社区  ›  A.Benson

使用R中数据帧的平均值和标准差数据生成单个数据分布

  •  0
  • A.Benson  · 技术社区  · 3 年前

    我有一个 data.frame 在里面 R ,包含几个分类变量,每个变量都有自己的平均值和标准差。我想从正态数据分布中为这些值定义的每个分类变量生成值,并生成单个 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
    

    从这里开始,我想做的是为每一行生成单独的数据帧,每个数据帧都包含基于 MEAN SD 列。

    例如,我会有一个单独的数据帧,其中包含。。。。

    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
    

    我正在处理的实际数据比十行大得多,所以我不想将整个数据子集化以生成单个 数据帧 如果我能帮忙的话。

    提前感谢

    0 回复  |  直到 3 年前
        1
  •  2
  •   Javier    3 年前

    使用 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 对象

        2
  •  1
  •   jlhoward    3 年前

    使用 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)
    
        3
  •  0
  •   jpsmith    3 年前

    您可以将所有内容放入列表中,然后将列表中的所有元素返回到全局环境中(如果需要,或者保留在列表中):

    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())