将数据帧列表传递到循环中以同时组合和更改标题

时间:2015-05-20 14:19:43

标签: r for-loop dataframe

我有一组具有不同标题的dfs,我需要逐行绑定:我希望更改cols的名称,以便每个标题具有相同的标题。

DF1

 name, score
 smith, 3
 smith, 7
 smith, 5

DF2

 type, price
 food, 3
 food, 5
 food, 2.6

我希望将它组合起来,使每个标题具有相同的标题并按行组合。我有32个这些数据帧都有不同的标题,所以我打算使用循环

我列出了dfs

 groups <- c(df1, df2, df3, etc)

然后尝试组合成一个空的df:

 new_df <- data.frame(words=character(),numbers=numeric())

 for (i in 1:length(groups))
 {
 x <- data.frame(words=character(),numbers=numeric())
 x[,1] <- groups[i]
 x[,2] <- groups[i+1]
 new_df <- rbind(new_df, x)
 }

不幸的是,它只返回一个带有一堆警告的空df。谁能告诉我如何纠正这个?我希望new_df是;

 words, numbers
 smith, 3
 smith, 7
 smith, 5
 food, 3
 food, 5
 food, 2.6    

我确信对于比我更有经验的人来说这很容易。谢谢

2 个答案:

答案 0 :(得分:5)

为什么你的32个data.frames在list中并不完美?首先从野外捕捉它们:

dfList <- mget(paste0("df", 1:32))

然后您可以使用lapply

dfList <- lapply(dfList, setNames, nm = c("words", "numbers"))

最后你rbind他们:

DF <- do.call(rbind, dfList)

答案 1 :(得分:1)

您希望do.callrbind.data.frame正确执行此操作。 do.call调用一个函数并为其提供一个参数列表,rbind.data.frame参数为rbind专门用于数据框。

请注意,这仅适用于变量df1$wordsdf2$words不是因素,否则您将遇到没有正确因子水平的问题。

new.df <- do.call(what = rbind.data.frame,
                  args = list(df1,df2))

编辑添加:更一般地说,您一直想使用rbind()功能。您一直在尝试使用循环,但这应该通过R中的函数来完成。

另外,正如David Arenburg所指出的,rbind()只有在您的表具有相同的变量名时才会起作用。解决这个问题的一种快速方法可能是在所有这些问题上使用setNames()来为它们指定相同的名称。

list_of_dfs <- list(df1,df2,df...)
list_of_dfs <- lapply(X = list_of_dfs,
                      FUN = setNames,
                      nm = c("words","numbers"))
big.df <- do.call(what = rbind.data.frame,
                  args = list_of_dfs)