You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:10:30