R语言使用for循环计算年份与价格变量乘积生成对应新变量的问题
错误原因
你当前出现全NA值和报错的核心原因是误用了recode()函数:该函数的作用是对向量内的现有值做重编码替换,完全不适用「两个变量相乘生成新变量」的需求,没有匹配到替换规则的值自然会被处理为NA。
正确的for循环实现方案
步骤1:提取所有年份标识
首先从现有列名中提取需要计算的年份后缀:
# 匹配所有以var开头后跟数字的列名 var_col_names <- grep("^var\\d{4}", names(mydata), value = TRUE) # 提取年份后缀,比如从var1874中提取出1874 year_list <- gsub("var", "", var_col_names)
步骤2:编写for循环计算乘积
for (year in year_list) { # 拼接对应年份的var列名、num列名、新变量名 var_col <- paste0("var", year) num_col <- paste0("num", year) new_col <- paste0("newvar", year) # 直接两列相乘赋值给新列,用[[提取列避免tibble返回子集的问题 mydata[[new_col]] <- mydata[[var_col]] * mydata[[num_col]] }
运行后就会自动生成所有newvar+年份的新列,值为对应年份var和num变量的乘积。
可选的非循环实现(tidyverse风格)
如果你习惯用dplyr语法,也可以不用写显式循环,一行代码完成批量计算:
library(dplyr) mydata <- mydata %>% mutate(across(starts_with("var"), ~ .x * get(gsub("var", "num", cur_column())), .names = "newvar{sub('var', '', .col)}"))
内容的提问来源于stack exchange,提问作者B.Nin
相关产品推荐
相关产品推荐

