我想在多个数据帧中添加多个空列。我知道为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)
我没有收到错误消息,但这两行代码也没有添加空列。
答案 0 :(得分:1)
原则上,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]]
会分别为a
和b
添加空列。