r - 在R中的for循环中用变量名命名列
问题描述
我有三个数据集,涉及三个场景(基础、向上、向下):
profile_base
、profile_up
、profile_down
。
我创建了一个 for 循环,用于在所有 3 个表中运行一些计算,并且我需要在最后调整特定列的名称。以下不起作用,给出错误:
赋值目标扩展到非语言对象
我尝试了同样的方法setNames
。
for (i in c('base','up',’down’))) {
colnames(get(paste0("profile_",i)))[2] <- paste0("Probability_", i )
}
解决方案
colnames<-
什么是所谓的替换函数,这在 SO 中的以下答案中得到了很好的解释:什么是 R 中的替换函数?
更接近您的示例,请考虑以下代码:
> colnames(data.frame(v1=1,v2=2))<-c("a", "b")
Error in colnames(data.frame(v1 = 1, v2 = 2)) <- c("a", "b") :
target of assignment expands to non-language object
> "colnames<-"(data.frame(v1=1,v2=2), c("a", "b"))
a b
1 1 2
因此,如果您真的想遍历对象名称的向量(我不建议这样做, - 在大多数情况下,命名列表会更好),您可以使用"colnames<-"
语法,但不能使用colnames(get(whatever))<-...
. 假设您的对象是数据帧(不是矩阵),您可能会编写一个基于 的新函数setNames
,例如,像这样:
setSomeNames <- function(object=nm, i, nm){ names(object)[i] <- nm; object}
# to set only ith name, not all names
setSomeNames(data.frame(v1=1,v2=2), 2, "bang")
# the second name is set to "bang"
...并且循环可以像这样工作:
profile_base <- profile_up <- profile_down <- data.frame(v1=1,v2=2) # dummy data
for (i in c('base','up','down')) {
foo <- paste0("profile_", i)
assign(foo, setSomeNames(get(foo), 2, paste0("Probability_", i)))
}
或者,您可以构造一个调用,然后对其进行评估。(好吧,我实际上并不建议这样做 - 在您的情况下,三个简单的分配将是最简单的解决方案,然后使用命名列表。但这可能对 R 的工作方式具有指导意义)。
profile_base <- profile_up <- profile_down <- data.frame(v1=1,v2=2) # resetting the dummy data
for (i in c('base','up','down'))
eval(call("<-", call("[", call("colnames", as.name(paste0("profile_", i))), 2), paste0("Probability_", i)))
最后,总有一种eval-parse方法,如果你愿意的话,你可以自己弄清楚:) 例如,评估作为字符串给出的表达式
推荐阅读
- html - 如何让跨度边距留在 div 旁边,并垂直对齐中心?
- selenium - PyCharm 新手;打开 FireFix 网络驱动程序时出错
- java - Java / Azure / Jni4Net / dll / Win32Exception (0x80004005):访问被拒绝
- azure-sql-database - Azure SQL 服务器中缺少存储过程 sp_MShelpcolumns
- knockout.js - 从外部函数访问 Knockout 函数
- electron - 在有或没有电子的情况下使用 Nuxt.js 项目
- jenkins - 远程触发时,构建用户 vars 插件不会初始化变量
- tensorflow - 张量流中的条件打印节点
- python - 如何从 Python 获取维基百科列表?
- c# - OracleCommand SQL 参数不起作用