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

Tidyverse中链式mutate调用的更紧凑实现方式咨询

在Tidyverse中简化链式mutate调用的方法

你完全可以通过合并多个mutate()调用为单次调用来简化代码——mutate()本身支持在同一个调用里定义任意数量的新变量,哪怕变量之间存在依赖(比如后定义的变量使用前面刚生成的变量)也能正常运行。

修改后的示例代码如下:

library(tidyverse)

REPEATS = 100
SAMPLE_SIZE = 617
N = REPEATS * SAMPLE_SIZE

BASELINE_SECURE_P = 0.6
LOG_BASELINE_SECURE_ODDS = log(BASELINE_SECURE_P / (1 - BASELINE_SECURE_P))
DAYCARE_LOG_OR_PER_HOUR = log(2.0)/3561 
WEEKS_PER_MONTH = 52 / 12

CARE_TYPES <- c("Mother", "Father", "Grandparent", "In-Home", "Child-Care Home", "Daycare")
CARE_TYPE_P <- c(.24, .15, .15, .15, .15, .36)
ACD <- c("A", "C", "D")
ACD_FREQ <- c(55, 197, 187) # Frequencies from 2001 Table 3 
ACD_P <- ACD_FREQ/sum(ACD_FREQ)

df <- data.frame(
  sample_no = rep(1:REPEATS, each=SAMPLE_SIZE),
  care_type = as.factor(sample(CARE_TYPES, N, prob = CARE_TYPE_P, replace = TRUE)),
  starting_age = runif(N, 0, 36)
) |> mutate(
  # 照料时长相关变量
  nonmaternal_hours_per_week = ifelse(care_type == "Mother", 0, pmax(0, rnorm(N, 30, 15))),
  daycare_hours_per_week = ifelse(care_type == "Daycare", nonmaternal_hours_per_week, 0),
  # 总时长计算
  nonmaternal_total_hours = nonmaternal_hours_per_week * WEEKS_PER_MONTH * (36 - starting_age),
  daycare_total_hours = daycare_hours_per_week * WEEKS_PER_MONTH * (36 - starting_age),
  # 安全感概率计算
  secure_log_or = LOG_BASELINE_SECURE_ODDS - DAYCARE_LOG_OR_PER_HOUR * daycare_total_hours,
  secure_p = exp(secure_log_or) / (1 + exp(secure_log_or)),
  # 最终分类变量
  is_secure = rbinom(N, 1, secure_p),
  acd_random = sample(ACD, N, prob = ACD_P, replace = TRUE),
  ssp_abcd = as.factor(ifelse(is_secure, 'B', acd_random))
)

补充说明

如果变量逻辑上可以分成不同模块,可在单个mutate()里用空行或注释分组,既保持代码紧凑,又不丢失可读性。若某些变量的生成逻辑重复,还可以封装成自定义函数,在mutate()里调用进一步简化。

内容的提问来源于stack exchange,提问作者Mohan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:13:17