【问题标题】:Adding empty columns to multiple dataframes向多个数据框添加空列
【发布时间】:2015-01-15 17:49:21
【问题描述】:

我想向多个数据框添加多个空列。我知道为 1 个数据帧执行此操作的代码是 df[,namevector] <- NA (other question)。 Namevector 是一个向量,其中包含应添加的空变量的名称。我有一个包含多个数据框的列表,所以我认为下面的代码可以解决问题。

a <- data.frame(x = 1:10, y = 21:30)
b <- data.frame(x = 1:10, y = 31:40)
c <- list(a,b)
namevector <- c("z","w")     

EmptyVariables <- function(df) {df[,namevector] <- NA}
sapply(X = c, FUN = EmptyVariables)

我没有收到错误消息,但这两行代码也没有添加空列。

【问题讨论】:

  • 您没有将结果分配给全局环境中的符号,因此它们仅存在于 sapply 调用中,然后被标记为垃圾回收。不过,sapply 函数不会更改原始数据帧。欢迎使用函数式编程。
  • 还有一个我不认识的问题,那就是“EmptyVariables”函数的返回值是 NA。它应该被定义为&lt;- function(df) {df[,namevector] &lt;- NA; df}

标签: r sapply


【解决方案1】:

原则上,BondedDust 的 cmets 中有解决方案,但也许一些额外的解释可能会有所帮助。

为什么您的原始代码不起作用?关于这件事有两点要说:

  • 正如 BondedDust 提到的,函数 EmptyVariables 内部的赋值是在函数的环境中完成的。因此,只有数据框df 的本地副本被更改,但不会 存在于全局环境中的df。调用 EmtpyVariables(a) 使 a 保持不变。
  • 函数返回其最后一行的输出。由于EmptyVariables 的最后一行是赋值,并且由于赋值在 R 中不返回任何内容,因此该函数也不返回任何内容。这就是您在调用sapply 时只需两次获得NA 的原因。 BondedDust 已经指出了解决方案:函数体应该是{df[,namevector] &lt;- NA;df}。在这种情况下,更改的数据帧作为函数的结果返回。

还有一个关于sapply 的评论:这个函数试图返回一个向量或矩阵。但是您的数据框列表不能以这种方式合理地简化,因此您应该使用lapply。

最后,这是应该做你想做的代码:

EmptyVariables <- function(df) {df[,namevector] <- NA;df}
res <- lapply(X = c, FUN = EmptyVariables)

res 将是一个包含两个数据框的列表。因此,res[[1]] 和 res[[2]] 将分别为您提供 a 和 b,并添加了空列。

【讨论】:

  • 非常感谢。我是根据 BondedDusts 的解释弄清楚的,但很高兴有一个更详细的解释以供将来参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 2015-05-25
  • 1970-01-01
  • 2015-09-04
相关资源
最近更新 更多