【发布时间】:2016-06-24 20:20:03
【问题描述】:
我有一个关于 lapply 的非常简单的问题。我正在从 STATA 过渡到 R,我认为有一些非常基本的概念我没有得到关于在 R 中循环的知识。但是我整个下午都在阅读它并且无法找到一种合理的方法来做这个非常简单的事情.
我有三个数据框 df1、df2 和 df3,它们都具有相同的列名、相同的顺序等。
我想一次性重命名它们的列。
我将数据框放在一个列表中:
dflist <- list(df1, df2, df3)
我想要的新名称:
varlist <- c("newname1", "newname2", "newname3")
编写一个函数,将名称替换为 varlist 中的名称,并将其应用于数据帧
ChangeNames <- function(x) {
names(x) <- varlist
return(x)
}
dflist <- lapply(dflist, ChangeNames)
因此,据我了解,R 更改了我放入列表中的数据帧副本的名称,但没有更改原始数据帧本身。我希望重命名数据框本身,而不是列表的元素(被困在列表中)。
现在我可以走了
df1 <- as.data.frame(dflist[1])
df2 <- as.data.frame(dflist[2])
df2 <- as.data.frame(dflist[3])
但这似乎很奇怪。你需要一个循环来取回循环的元素吗?
基本上:一旦您将一些数据框放入一个列表并通过 lapply 在它们上运行您的函数,您如何将它们从列表中移出,而不是从第一个开始?
【问题讨论】:
-
我认为更多的 R 方法是使用
bigdf <- dplyr::bind_rows(dflist, .id = "dfid")之类的东西将 3 个数据帧绑定在一起,然后在需要时将其子集在dfid列中。 -
如果 data.frames 具有相似的结构,最好将它们保存在一个列表中并从那里使用它们。请特别参阅this post,gregor 关于为什么这是一项好技术的回答。
-
感谢 Imo 引导我回答 gregor 的这个答案。很有帮助。