R语言如何基于命名列表重命名data.frame的列?
问题原因
你的代码运行不符合预期,核心是$操作符的匹配逻辑问题:mylist$x会固定查找列表中名为x的元素,不会解析函数传入的变量x存储的实际列名(比如var1/var2),因此返回结果全为NULL,无法完成替换。
最优实现(基础R无依赖)
不需要用sapply循环遍历列名,直接通过名字索引批量赋值即可,不在命名列表中的列会自动保留原名,完全匹配你的预期结果:
names(mytable)[names(mylist)] <- unlist(mylist)
运行后验证列名:
> names(mytable) [1] "toto" "titi" "var6"
原sapply写法的修正版本
如果要沿用你原来的遍历思路,只需要把$替换为支持动态取值的[[操作符,同时增加判断逻辑,保留不在映射列表里的列名即可:
names(mytable) <- sapply(names(mytable), function(x) { if (x %in% names(mylist)) mylist[[x]] else x })
该写法可以得到相同结果,但执行效率低于直接索引赋值,不推荐优先使用。
内容的提问来源于stack exchange,提问作者Damien Dotta
相关产品推荐
相关产品推荐

