修改列表中的数据框以具有相同的行数

时间:2019-03-29 20:44:06

标签: r

我正在尝试合并数据帧(数百个),但是它们具有不同的行数。

df1 <- data.frame(c(7,5,3,4,5), c(43,56,23,78,89))

df2 <- data.frame(c(7,5,3,4,5,8,5), c(43,56,23,78,89,45,78))

df3 <- data.frame(c(7,5,3,4,5,8,5,6,7), c(43,56,23,78,89,45,78,56,67))

colnames(df1) <- c("xVar1","xVar2")

colnames(df2) <- c("yVar1","yVar2")

colnames(df3) <- c("zVar1","zVar2")

a1 <- list(df1,df2,df3)

a1是我获得原始数据时的实际样子。

现在,如果我这样做:

b1 <- as.data.frame(a1) 

我收到一个错误,因为数据中的行数不相同(如果行数相同,则可以正常工作)。

如何使行数相等或解决此问题?

我希望能够以这种方式合并数据(这是一个具有相同行数的有效示例):

df1b <- data.frame(c(7,5,3,4,5), c(43,56,23,78,89))

df2b <- data.frame(c(7,5,3,4,6), c(43,56,24,48,89))

df3b <- data.frame(c(7,5,3,4,5), c(43,56,23,78,89))

colnames(df1b) <- c("xVar1","xVar2")

colnames(df2b) <- c("yVar1","yVar2")

colnames(df3b) <- c("zVar1","zVar2")

a2 <- list(df1b,df2b,df3b)

b2 <- as.data.frame(a2)

谢谢!

3 个答案:

答案 0 :(得分:1)

cbind.fill中的

rowr为此提供了功能,并用NA填充了缺少的元素:

library(purrr)
library(rowr)
b1 <- purrr::reduce(a1,cbind.fill,fill=NA)

答案 1 :(得分:1)

可以向每个数据帧添加一个键(在这种情况下,行数作为变量值),然后通过该键合并。

# get list of dfs (should prob import data into a list of dfs instead)
list_df<-mget(ls(pattern = "df[0-9]"))


#add newcolumn -- "key"
list_df<-lapply(list_df, function(df, newcol) {

  df[[newcol]]<-seq(nrow(df))
  return(df)

}, "key")


#merge function
MergeAllf <- function(x, y){
  df <- merge(x, y, by= "key", all.x= T, all.y= T)
}

#pass list to merge funct
library(tidyverse)
data <- Reduce(MergeAllf, list_df)%>%
  select(key, everything())#reorder or can drop "key"


data
 key xVar1 xVar2 yVar1 yVar2 zVar1 zVar2
1   1     7    43     7    43     7    43
2   2     5    56     5    56     5    56
3   3     3    23     3    23     3    23
4   4     4    78     4    78     4    78
5   5     5    89     5    89     5    89
6   6    NA    NA     8    45     8    45
7   7    NA    NA     5    78     5    78
8   8    NA    NA    NA    NA     6    56
9   9    NA    NA    NA    NA     7    67

答案 2 :(得分:0)

解决方案1 ​​

您可以使用rbindlist()来实现。请注意,列名将是列表中第一个数据框的列名:

library(data.table)
b1 = data.frame(rbindlist(a1))
> b1
   xVar1 xVar2
1      7    43
2      5    56
3      3    23
4      4    78
5      5    89
6      7    43
7      5    56
8      3    23
9      4    78
10     5    89
11     8    45
12     5    78
13     7    43
14     5    56
15     3    23
16     4    78
17     5    89
18     8    45
19     5    78
20     6    56
21     7    67

解决方案2

或者,使所有列具有相同的名称,然后按行绑定:

b1 = lapply(a1, setNames, c("Var1","Var2"))

现在您可以按行绑定:

b1 = do.call(dplyr::bind_rows, b1)
> b1
   Var1 Var2
1     7   43
2     5   56
3     3   23
4     4   78
5     5   89
6     7   43
7     5   56
8     3   23
9     4   78
10    5   89
11    8   45
12    5   78
13    7   43
14    5   56
15    3   23
16    4   78
17    5   89
18    8   45
19    5   78
20    6   56
21    7   67