R语言:如何在数据框中按分组生成条件随机变量
解决方案:按分组生成条件正态分布随机变量
嗨,作为R语言初学者,这个需求其实挺常见的,咱们可以用两种容易理解的方法来实现,我会把每一步都讲清楚,你跟着做就行~
首先先确认一下你的原始数据,方便后续操作:
# 你的原始数据 group_assigned <- c("A","A","B","C","A","C") dframe <- data.frame(group_assigned) groups <-c("A","B","C") group_mean <- c(50,40,30) group_stddev <- c(10,5,5) group_properties <- data.frame(groups,group_mean, group_stddev)
方法一:用dplyr(推荐,语法更直观)
如果你还没装过dplyr包,先安装一下(只需要装一次):
install.packages("dplyr")
然后加载包:
library(dplyr)
接下来咱们把数据关联起来,再按分组生成随机数:
dframe_with_rand <- dframe %>% # 把两个数据框按分组列连接,让每一行都拿到对应分组的均值和标准差 left_join(group_properties, by = c("group_assigned" = "groups")) %>% # 告诉dplyr按行处理,这样每一行用自己的均值标准差生成随机数 rowwise() %>% # 生成新列random_value,每个值对应分组的正态分布随机数 mutate(random_value = rnorm(1, mean = group_mean, sd = group_stddev)) %>% # 取消按行分组的状态,恢复常规数据框操作 ungroup() %>% # 可选:如果不需要中间的均值和标准差列,可以删掉 select(-group_mean, -group_stddev) # 查看结果 print(dframe_with_rand)
方法二:基础R实现(不用额外安装包)
如果你暂时不想装新包,用基础R也能搞定:
# 第一步:把每个分组的均值和标准差匹配到dframe里 dframe$group_mean <- group_properties$group_mean[match(dframe$group_assigned, group_properties$groups)] dframe$group_stddev <- group_properties$group_stddev[match(dframe$group_assigned, group_properties$groups)] # 第二步:逐行生成对应分组的随机数 dframe$random_value <- mapply(rnorm, n=1, mean=dframe$group_mean, sd=dframe$group_stddev) # 可选:删掉不需要的中间列 dframe <- dframe[, !names(dframe) %in% c("group_mean", "group_stddev")] # 查看结果 print(dframe)
小提示
- 两种方法都能得到你想要的结果,如果你以后经常处理数据,推荐多了解一下tidyverse系列工具(dplyr就是其中之一),语法更贴近自然语言,容易上手
- 每次运行代码生成的随机数都会不一样,如果需要固定结果方便调试,可以在代码开头加
set.seed(123)(数字可以随便选),这样每次生成的随机数都是一样的 - 如果需要给每个行生成多个随机数,只需要把
rnorm(1, ...)里的1改成你想要的数量就行
内容的提问来源于stack exchange,提问作者meomeomeo
相关产品推荐
相关产品推荐

