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
相关产品推荐
相关产品推荐

