R语言for循环遍历数据集列名时通过$访问列返回NULL的问题
问题核心原因
bm$i返回NULL是R数据框取列的基础语法特性导致的:$操作符在取列时,仅匹配紧随其后的字面文本,不会解析变量存储的字符串值来匹配列。
你写bm$i时,R会直接去数据框里找名叫"i"的列,找不到自然返回NULL,根本不会读取你循环变量i里存的"contact"、"job"这类实际列名字符串。
可运行的修正代码
把$替换为支持变量解析的[[操作符,就能正确遍历每一列了。调整后的循环代码如下:
for (i in colnames(bm)) { # 跳过y列本身,避免生成y和自身对比的无意义交叉表 if (i == "y") next print(i) print(plot_xtab(bm$y, bm[[i]], margin = "row", bar.pos = "stack", axis.titles = "Deposit Subscription", legend.title = i, # 原代码写固定值1,替换为当前列名更符合图例的展示逻辑 show.values = TRUE, show.n = FALSE, geom.size = 0.5, expand.grid = TRUE, vjust = "right")) }
其他等效的取列方式
如果不想用[[写法,以下两种方式也可以正确获取当前循环对应的列:
- 用单括号索引取列:将
bm[[i]]替换为bm[, i] - 用dplyr的pull语法:将
bm[[i]]替换为pull(bm, i)
补充说明:你单独指定
bm$contact能正常运行,是因为此时$后接的是字面的实际列名,完全符合$的匹配规则;循环传变量的场景和这种写死列名的场景,在R的取列逻辑里是完全不同的两类操作。
内容的提问来源于stack exchange,提问作者Tony Guo
相关产品推荐
相关产品推荐

