R语言for循环中如何将已有列值赋值给对应新生成列
你代码中高亮行无法生效的核心原因是:paste0生成的是普通字符串,R不会自动将其识别为数据框的列引用,相当于你在给字符串对象赋值,完全没有触达数据框的实际列。
方案1:基础R循环(最贴合你现有写法的修改)
直接用数据框的双中括号[[ ]]语法操作动态列名,不需要额外生成字符串再解析,代码如下:
# 如果需要包含newcol0对应Column0,把循环范围改为0:3即可 for(i in 1:3) { # 分别生成新旧列名 old_col <- paste0("Column", i) new_col <- paste0("newcol", i) # 直接用双中括号索引完成赋值,保留原列的同时生成新列 mydata[[new_col]] <- mydata[[old_col]] }
提示:你原有代码里先给新列赋值
rep(i)的步骤完全多余,上述代码会直接覆盖生成对应值的新列,可以删掉那部分无用逻辑。
方案2:tidyverse简洁写法(不需要写循环)
如果可以加载dplyr包,用批量操作语法一步完成所有对应列的生成,代码更简洁易读:
library(dplyr) library(stringr) mydata <- mydata %>% mutate( # 匹配所有以Column开头的列,批量生成对应newcol前缀的新列 across(starts_with("Column"), .fns = ~.x, .names = "newcol{str_remove(.col, 'Column')}") )
不推荐的写法
你可能会搜到用eval(parse())的解法:
# 非常不推荐,可读性差、易出安全问题 for(i in 1:3) { eval(parse(text = paste0("mydata$newcol",i," <- mydata$Column",i))) }
这种写法虽然可以运行,但生产环境下完全不推荐,优先选前两种方案。
内容的提问来源于stack exchange,提问作者user2827927
相关产品推荐
相关产品推荐

