R语言:for循环迭代添加数据框列报错的解决方法
循环迭代生成数据框列的错误修复
问题描述
需要通过循环迭代向数据框添加列,期望生成如下结构的数据框:
> data x x_1 x_2 x_3 1 10 11 12 13 2 11 12 13 14 3 12 13 14 15 4 13 14 15 16 5 14 15 16 17 6 15 16 17 18
当前代码生成x_1列后报错:Error: Problem with mutate() column x_2. i x_2 = x_prior + 1. x non-numeric argument to binary operator,要求保留循环逻辑(首列基于x,后续列基于前一列),看重可读性。
原代码:
library(dplyr) library(stringr) data <- data.frame(x = 10:15) for(i in 1:3) { x_curnt <- str_c("x_", i) x_prior <- str_c("x_",i-1) data <- if(i==1){ data %>% mutate(!! x_curnt:= x + 1)} else { data %>% mutate(!! x_curnt:= x_prior + 1) } } data
错误原因
当i >= 2时,x_prior是字符串类型(如"x_1"),直接执行x_prior + 1是尝试将字符串与数值相加,触发非数值参数的错误。需要将字符串转换为对数据框列的有效引用。
修复方案
方案1:使用sym()转换字符串为列符号
在else分支中,用sym()将x_prior转换为dplyr可识别的列符号,再通过!!注入表达式:
library(dplyr) library(stringr) data <- data.frame(x = 10:15) for(i in 1:3) { x_curnt <- str_c("x_", i) x_prior <- str_c("x_", i-1) data <- if(i == 1){ data %>% mutate(!!x_curnt := x + 1) } else { data %>% mutate(!!x_curnt := !!sym(x_prior) + 1) } } print(data)
方案2:使用.data代词引用列
利用dplyr的.data代词直接通过字符串引用列,代码更简洁:
library(dplyr) library(stringr) data <- data.frame(x = 10:15) for(i in 1:3) { x_curnt <- str_c("x_", i) x_prior <- if(i == 1) "x" else str_c("x_", i-1) data <- data %>% mutate(!!x_curnt := .data[[x_prior]] + 1) } print(data)
说明
两种方案均保留了循环的可读性,且符合需求:首列基于基础列x,后续列基于前一次迭代生成的列。循环次数不超过20次时,这种实现方式清晰直观。
内容的提问来源于stack exchange,提问作者Village.Idyot
相关产品推荐
相关产品推荐

