基于条件通过列值除法创建新列的R语言技术问询
高效计算支出占收入比例的R方案
预处理数据(解决读取后空格和类型问题)
首先清理输入数据中的多余空格,并转换数值列类型:
library(dplyr) # 读取原始数据 df_inp <- read.delim(text="Individuals| quarter | wage | foodq1 | foodq2 | rentq1 1 | 2016q1 | 100 | 1 | 2 | 50 1 | 2016q2 | 100 | 1 | 2 | 50 1 | 2016q3 | 200 | 1 | 2 | 50 1 | 2016q4 | 300 | 1 | 2 | 50 2 | 2016q1 | 50 | 1 | 2 | 50 2 | 2016q2 | 100 | 1 | 2 | 50 2 | 2016q3 | 200 | 1 | 2 | 50 2 | 2016q4 | 100 | 1 | 2 | 50", sep="|") # 清理列值空格并转换数值列 df_inp <- df_inp %>% mutate(across(everything(), trimws)) %>% mutate(across(c(Individuals, wage, foodq1, foodq2, rentq1), as.numeric))
dplyr 批量处理方案(推荐)
用across函数一次性对所有支出列计算占收入的比例,自动生成带pro.前缀的新列:
df_outp <- df_inp %>% mutate( across( c(foodq1, foodq2, rentq1), # 指定要计算的支出列 ~ .x / wage, # 计算逻辑:支出/收入 .names = "pro.{col}" # 新列命名规则 ) ) %>% select(Individuals, quarter, wage, starts_with("pro.")) # 保留目标列
Base R 批量处理方案
如果不使用dplyr包,可通过循环批量生成新列:
# 定义支出列列表 exp_cols <- c("foodq1", "foodq2", "rentq1") # 循环计算比例并生成新列 for(col in exp_cols) { df_inp[[paste0("pro.", col)]] <- df_inp[[col]] / df_inp$wage } # 筛选目标列得到结果 df_outp_base <- df_inp[, c("Individuals", "quarter", "wage", paste0("pro.", exp_cols))]
两种方案都能避免ifelse带来的冗余行问题,实现高效批量计算,输出结果与你期望的df_outp完全一致。
内容的提问来源于stack exchange,提问作者becky_45
相关产品推荐
相关产品推荐

