【问题标题】:Adding column using a double loop使用双循环添加列
【发布时间】:2019-11-20 11:16:58
【问题描述】:

我有以下双循环:

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] 添加名称为“index”的列和输入索引 [1]。我通过以下方式实现了这一点:

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

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

【问题讨论】:

  • 制作一个可重现的错误示例。
  • 运行warnings() 时会发生什么?我可以看到您在files[i] = cbind(Index = indexnames[j], files[i]) 的左侧和右侧都有files[i] - 我认为这可能有问题。此外,当您以for(i in files) 循环时,i 不是索引,但files 中的实际值 - 所以files[i] 我认为没有意义。如果你想遍历files 的索引,你可以将迭代更改为for(i in seq_along(files))
  • 尝试list(aname, bname, cname, dname, etc.),然后在循环中files[[i]] <- etc。索引可能相同。
  • 我得到以下错误: In filenames[i]

标签: r loops


【解决方案1】:

你需要使用 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] ))
}

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

How to use `assign()` or `get()` on specific named column of a dataframe?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-14
    • 2018-05-10
    • 1970-01-01
    • 2015-06-24
    • 2023-03-11
    • 2020-07-20
    • 2012-12-28
    • 1970-01-01
    相关资源
    最近更新 更多