使用Tidyverse将数据框中每个因子替换为对应分布的随机值
基于Tidyverse的因子值随机映射解决方案
问题描述
现有一个所有变量均为因子的数据框:
A B C 1 1 1 2 2 1 3 2 1
每个因子值对应一个预定义的随机值分布:
one <- rnorm(5) # one 输出: # [1] 0.8257975 1.0291827 -0.5708449 0.1112144 -0.2817895 two <- rnorm(3) # two 输出: # [1] -2.06849794 -0.78663065 0.02430413 three <- rnorm(1) # three 输出: # [1] 0.1309044
需要将数据框中的每个因子值,随机替换为对应分布中的一个元素,示例输出如下:
A B C 0.8257975 1.0291827 -0.5708449 -2.06849794 -0.78663065 0.1112144 0.1309044 0.02430413 -0.2817895
Tidyverse解决方案
library(tidyverse) # 1. 定义因子与随机分布的映射列表 dist_mapping <- list( "1" = one, "2" = two, "3" = three ) # 2. 构造原数据框(已有则跳过此步) df <- tibble( A = factor(c(1, 2, 3)), B = factor(c(1, 2, 2)), C = factor(c(1, 1, 1)) ) # 3. 批量替换因子值为对应分布的随机抽取值 result_df <- df %>% mutate( across( everything(), ~ map_dbl(., ~ sample(dist_mapping[[as.character(.)]], size = 1, replace = TRUE)) ) ) print(result_df)
代码说明
dist_mapping:将因子的字符形式(因子转字符后才能匹配列表名)与对应随机分布绑定across(everything()):遍历数据框所有列,统一执行替换逻辑map_dbl():对每个因子值,从映射列表的对应分布中随机抽取1个元素;replace=TRUE确保抽取次数超过分布长度时仍能正常取值(不需要重复抽取可删除该参数)- 最终结果直接转为数值类型,符合需求输出格式
内容的提问来源于stack exchange,提问作者curiositasisasinbutstillcuriou
相关产品推荐
相关产品推荐

