【问题标题】:R: Change objects inside loopR:更改循环内的对象
【发布时间】:2018-11-04 16:35:49
【问题描述】:
a <- data.frame(x = c(1, 2))
b <- data.frame(x = c(3, 4))

for (df in list(a, b)) {
  print(df)
  df$y <- c(5, 6)
}

每个数据框都能正确打印出来,但添加一个额外的列会失败。
广泛的网络搜索建议类似

lapply(list(a, b), function(df){
  df$y <- c(5, 6)
})

但这对我没有帮助。

我也很感兴趣的是,为什么for 循环中的打印语句有效,但添加y 列失败。

这让我很惊讶。

【问题讨论】:

  • 无法理解您想要的输出内容。你能详细说明一下吗?
  • 通常,当您要编辑多个对象时,您还希望将它们存储在一个列表中。例如。 my_list &lt;- list(a = a, b = b)。然后你可以随心所欲地做my_list &lt;- lapply(my_list, ...)

标签: r loops for-loop apply lapply


【解决方案1】:

您必须返回带有该附加列的df。 试试:

lapply(list(a, b), function(df){
  df$y <- c(5, 6); return(df)
})

输出是:

[[1]]
  x y
1 1 5
2 2 6

[[2]]
  x y
1 3 5
2 4 6

正如@dash2 假设您可能希望将那些更改的df 分配给您的listdf。所以完整的代码可能如下所示:

a <- data.frame(x = c(1, 2))
b <- data.frame(x = c(3, 4))

l <- list(a, b)
l <- lapply(l, function(df){ df$y <- c(5, 6); return(df) })

【讨论】:

  • 然后您可能希望将结果分配给原始结果,例如my_list &lt;- lapply...; a &lt;- my_list[[1]]; b &lt;- my_list[[2]]
  • 非常感谢您的回答,这绝对有效。我实际上希望有一个更短的解决方案,因为如果一个只有 2 个 data.frame,那么执行a$y &lt;- c(5,6) 可能会更容易且更具可读性。
【解决方案2】:
> a <- data.frame(x = c(1, 2))
> b <- data.frame(x = c(3, 4))
> l <- list(a = a, b = b)
> list2env(lapply(l, function(x) {x$y <- c(5, 6);x}), envir = .GlobalEnv)
<environment: R_GlobalEnv>
> a
  x y
1 1 5
2 2 6
> b
  x y
1 3 5
2 4 6

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多