在R中的for循环中使用变量名命名列

时间:2018-12-17 17:31:12

标签: r for-loop

我有三个数据集,涉及三个场景(基准,上,下): ((get-hotfix | sort installedon)[-1] | Select-Object InstalledOn | ft -HideTableHeaders | out-string).trim() | out-file LastPatch.txt profile_baseprofile_up

我创建了一个for循环,用于在所有3个表中运行某些计算,并且需要在末尾调整特定列的名称。 以下内容无效,并显示错误消息:

  

分配对象扩展为非语言对象

我用profile_down尝试过相同的操作。

setNames

1 个答案:

答案 0 :(得分:0)

colnames<-是所谓的替换功能,在SO的以下答案中对此进行了很好的解释:What are Replacement Functions in 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<-"语法,但不能使用{{1 }}。假设您的对象是数据帧(而不是矩阵),则可以基于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"

或者,您可以构造一个调用,然后对其进行评估。 (嗯,我实际上并不建议这样做,在您的情况下,三个简单的分配将是最简单的解决方案,然后使用命名列表。但这可能对R的工作方式具有指导意义。 )。

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)))
} 

最后,总会有 eval-parse 方法,如果您愿意的话,可以自行解决:)例如Evaluate expression given as a string