首页 > 解决方案 > 使用双循环添加列

问题描述

我有以下双循环:

indexnames = c(a, b, c, d, etc.) 
# with
# length(indexnames) = 87
# class(indexnames) = "character"
# (indexnames = indexes I want to add in a column)

files = c(aname, bname, cname, dname, etc.) 
# with
# length(files) = 87
# class(files) = "character"
# (files = name of files in the global environment)

现在我想遍历这两个列表并向文件 [1] 添加名称为“索引”的列和输入索引 [1]。我通过以下方式实现了这一点:

for(i in files){
    for(j in indexnames){
      files[i] = cbind(Index = indexnames[j], files[i])
    }
}

当我运行它时,我收到一条包含 50 条或更多警告的错误消息。我究竟做错了什么?感谢任何帮助,谢谢。

标签: rloops

解决方案


您需要使用 get() 和 assign() 函数来获得您想要的行为。

实际上,在创建循环时,您不必在名称元素中使用 i 或 j。如果您以更易于阅读的方式命名循环,则调试循环会更容易。还是让我们看看循环的内部部分。

files[i]

给定文件是一个向量,您不能以这种方式通过它的值调用特定元素(您也不想这样做,因为它只是一个带有对象名称的向量)。而是让“i”循环通过一个数字向量“for(i in 1:87)”

for (index in 1:87) {
  assign( files[i] , `[[<-`(get(files[i]), 'index', value = indexnames[i] ))
}

我在这个答案中找到了一些帮助:

如何在数据框的特定命名列上使用`assign()`或`get()`?


推荐阅读