R语言含if-else的for循环遍历数据框列结果异常排查
错误原因
核心问题出在列索引的写法错误:R中$操作符只会匹配字面量列名,不会解析后面跟的变量。你写的df$i,等价于查找数据框中列名严格等于"i"的列,和循环变量i存储的"apples"、"oranges"字符串没有任何关系。
由于你的示例数据框里不存在名为i的列,df$i返回值全为NA,sum(NA == 5)的计算结果是NA,NA == 1的判断结果永远为FALSE,因此所有循环都会进入else分支,输出不符合预期的结果。
修正方案
只需要把动态取列的写法从df$i替换为支持变量索引的df[[i]]即可,修改后的完整可运行代码如下:
# 示例数据 df <- data.frame(apples = c(1, 5, 3), oranges = c(5, 3, 5)) # 修正后的循环 for(i in names(df)){ if(sum(df[[i]] == 5) == 1){ print(paste("There is only 1 occurance of 5 fruit for", i)) } else { print(paste("There is more than 1 occurance of 5 fruit for", i)) } }
运行后输出和预期完全一致:
[1] "There is only 1 occurance of 5 fruit for apples" [1] "There is more than 1 occurance of 5 fruit for oranges"
补充说明:不建议为了用
$硬写eval(parse())的动态拼接语法,这类写法可读性差、容易出隐式bug,R中动态按字符串取数据框列,优先用[[双中括号索引是通用最佳实践。
内容的提问来源于stack exchange,提问作者k3b
相关产品推荐
相关产品推荐

