将空列添加到多个数据帧

时间:2015-01-15 17:49:22

标签: r sapply

我想在多个数据帧中添加多个空列。我知道为1个数据帧执行此操作的代码是df[,namevector] <- NAother 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)

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

1 个答案:

答案 0 :(得分:1)

原则上,BondedDust的评论中有解决方案,但也许一些其他解释可能会有所帮助。

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

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

关于sapply的评论:此函数尝试返回向量或矩阵。但是,您的数据框列表无法以这种方式合理简化,因此您应该使用lapply

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

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

res将是一个包含两个数据框的列表。因此,res[[1]]res[[2]]会分别为ab添加空列。