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

基于条件通过列值除法创建新列的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 12:12:56