R:合并两个数据帧列表

时间:2017-12-06 10:51:07

标签: r list merge lapply mapply

我有两个数据框列表,如下所示:

L1 <- list(Q1=list(A=data.frame(X1=1:3),C=data.frame(X1=1:3)),
        Q2=list(B=data.frame(X1=1:3),C=data.frame(X1=1:3)))
L2 <- list(Q1=list(B=data.frame(X1=4:6),C=data.frame(X1=4:6)),
        Q2=list(A=data.frame(X1=4:6),C=data.frame(X1=4:6)))

第一级&#34; Q1&#34;和&#34; Q2&#34;在两个列表中都是相同的。

我想合并两个列表,以便具有相同名称的数据帧(例如&#34; $ Q1 $ C&#34;)将与rbind组合使用,并且新的列表将添加到列表中。所需的输出应如下所示:

> L3
$Q1
$Q1$A
  X1
1  1
2  2
3  3

$Q1$B
  X1
1  4
2  5
3  6

$Q1$C
  X1
1  1
2  2
3  3
4  4
5  5
6  6


$Q2
$Q2$A
  X1
1  4
2  5
3  6

$Q2$B
  X1
1  1
2  2
3  3

$Q2$C
  X1
1  1
2  2
3  3
4  4
5  5
6  6

我尝试使用Map()lapply()进行了一些组合,但我无法修复它。 E.g:

L3 <- Map('rbind',lapply(L1,'['),lapply(L2,'['))

感谢任何帮助!

3 个答案:

答案 0 :(得分:5)

以下是使用基础R的解决方案:

split(x, names(x))
  • Q1会将Q2放在一起并xsub <- do.call(c, unname(i))组合在一起;
  • Q1会将Q2data.frames组合成一个列表split(xsub, names(xsub));
  • data.frame会按名称ABC)对# $Q1 # $Q1$A # X1 # 1 1 # 2 2 # 3 3 # # $Q1$B # X1 # 1 4 # 2 5 # 3 6 # # $Q1$C # X1 # 1 1 # 2 2 # 3 3 # 4 4 # 5 5 # 6 6 # # # $Q2 # $Q2$A # X1 # 1 4 # 2 5 # 3 6 # # $Q2$B # X1 # 1 1 # 2 2 # 3 3 # # $Q2$C # X1 # 1 1 # 2 2 # 3 3 # 4 4 # 5 5 # 6 6 进行分组;

输出结果为:

qm2.set_offsets([x_shift, y_shift])

答案 1 :(得分:0)

以下是使用reshape2::melt的方法。

library(reshape2);

# Collapse lists and turn into long dataframe
df.long <- rbind.data.frame(
    melt(L1, id.vars = "X1"),
    melt(L2, id.vars = "X1"));

# Split dataframe into nested list
lst <- lapply(split(df.long, df.long$L1), function(x) split(x, x$L2));
lst <- lapply(lst, function(x) lapply(x, function(y) data.frame(X1 = y$X1)));

str(lst);
#List of 2
# $ Q1:List of 3
#  ..$ A:'data.frame':  3 obs. of  1 variable:
#  .. ..$ X1: int [1:3] 1 2 3
#  ..$ B:'data.frame':  3 obs. of  1 variable:
#  .. ..$ X1: int [1:3] 4 5 6
#  ..$ C:'data.frame':  6 obs. of  1 variable:
#  .. ..$ X1: int [1:6] 1 2 3 4 5 6
# $ Q2:List of 3
#  ..$ A:'data.frame':  3 obs. of  1 variable:
#  .. ..$ X1: int [1:3] 4 5 6
#  ..$ B:'data.frame':  3 obs. of  1 variable:
#  .. ..$ X1: int [1:3] 1 2 3
#  ..$ C:'data.frame':  6 obs. of  1 variable:
#  .. ..$ X1: int [1:6] 1 2 3 4 5 6

数据

L1 <- list(Q1=list(A=data.frame(X1=1:3),C=data.frame(X1=1:3)),
        Q2=list(B=data.frame(X1=1:3),C=data.frame(X1=1:3)))
L2 <- list(Q1=list(B=data.frame(X1=4:6),C=data.frame(X1=4:6)),
        Q2=list(A=data.frame(X1=4:6),C=data.frame(X1=4:6)))

答案 2 :(得分:0)

使用purrr:

library(tidyverse)

f <- function(x) {
  map_df(map(x, bind_rows, .id = "id1"), bind_rows, .id = "id2")
}

list(L1, L2) %>%
  map_df(f) %>%
  split(list(.$id1, .$id2)) %>%
  map(select, X1)