R中for循环获取动态生成变量值 paste生成列名取数问题求助
问题根因
R中$运算符不支持直接传入字符串格式的列名,当你传入带引号的字符串时,R会将引号识别为列名的一部分,无法匹配到实际不带引号的列。如果你的数据是tibble类型,使用[行,列]索引时默认返回单列表格而非向量,也会导致后续计算异常。
解决方案
动态列名读取改用[[运算符,或者在方括号索引中加drop=TRUE将结果转为向量即可,两种写法示例如下:
- 双中括号写法(推荐,同时适配data.frame和tibble类型):
CurColumn <- mydata2[[paste0("Columns",i)]][row] - 方括号加drop参数写法:
CurColumn <- mydata2[row, paste0("Columns",i), drop=TRUE]
原有代码其他问题修正
你的代码还存在两处逻辑错误,会导致最终结果不符合预期:
- 内外层循环都使用了变量
i,内层循环会覆盖外层的i值,导致逻辑混乱,建议将内层循环变量改为其他名称如k - 当前
mydata2$T1 <- CurColumn的写法会把整个T1列都赋值为当前行计算出的结果,需要修改为按行赋值,仅修改当前行的T1、T2值
修正后完整代码
mydata2 <- mydata1 # 修正原代码的拼写错误maydata1 x <- 10 alpha <- 0.63 beta <- 0.2 # 补充逐行遍历数据框的外层循环 for (row in 1:nrow(mydata2)) { for (i in 1:x) { j <- i + 1 # 内层循环变量改为k,避免覆盖外层i for (k in 1:j) { CurColumn <- mydata2[[paste0("Columns",k)]][row] NextColumn <- mydata2[[paste0("Columns",j)]][row] DiffColumn <- NextColumn - CurColumn if ( (CurColumn <= alpha & alpha <= NextColumn) | ( DiffColumn < beta)) { # 按行赋值,避免覆盖整列数据 mydata2$T1[row] <- CurColumn mydata2$T2[row] <- NextColumn CurActParams <- mydata2[[paste0("AP",k)]][row] NextActParams <- mydata2[[paste0("AP",j)]][row] break } } } }
内容的提问来源于stack exchange,提问作者Zakir Hussain
相关产品推荐
相关产品推荐

