R中数据框的联合

时间:2016-04-19 02:15:07

标签: r dataframe

我在列表L中有4个数据帧,如下所示:

L[[1]]:

V1   V2
B    C
A    B
Z    B

L[[2]]:

V1   V2
B    D
A    B
Z    B

L[[3]]:

V1   V2
Z    Y
X    Z
N    Z

L[[4]]:

V1   V2
Z    J
X    Z
N    Z

这来自头部C,D,Y和J的图形。 显然,C和D来自同一个图,Y和J.也是如此。 如果这些数据帧在列表L?

中,如何将C与D和Y合并为J.

我在想的是,迭代列表和成对比较。如果dfx与dfy merge相交。任何人都可以帮助使用R代码吗?

编辑: 我在想的是这样的: 获取第一个元素,比较第二个元素,如果没问题,合并并保存到第一个元素,删除第二个元素,移动到下一个元素直到最后一个元素。重复,直到剩余元素未被删除。有了这个,列表将包含已合并的剩余元素任何人都知道如何在代码中实现它? 预期产出:

L[[1]]:

V1   V2
B    C
B    D
A    B
Z    B

L[[2]]:

V1   V2
Z    Y
Z    J
X    Z
N    Z

1 个答案:

答案 0 :(得分:0)

这可能是一种解决方案吗?

# create list of data.frames
ld <- list(
  data.frame(V1 = c("B","A","Z"), V2 = c("C","B","B")),
  data.frame(V1 = c("B","A","Z"), V2 = c("D","B","B")),
  data.frame(V1 = c("Z","X","N"), V2 = c("Y","Z","Z")),
  data.frame(V1 = c("Z","X","N"), V2 = c("J","Z","Z"))
  )
# suggested solution
union_ld <- data.table::rbindlist(ld)
unique(union_ld)

结果:

   V1 V2
1:  B  C
2:  A  B
3:  Z  B
4:  B  D
5:  Z  Y
6:  X  Z
7:  N  Z
8:  Z  J

更新1

快速入侵:OP请求的列表中的两个数据帧。根据OP的评论,每个结果数据框中行的顺序并不重要。

list(
  unique(data.table::rbindlist(ld[1:2])),
  unique(data.table::rbindlist(ld[3:4]))
)

结果:

[[1]]
   V1 V2
1:  B  C
2:  A  B
3:  Z  B
4:  B  D

[[2]]
   V1 V2
1:  Z  Y
2:  X  Z
3:  N  Z
4:  Z  J

建议的解决方案将列表中的前两个数据帧合并为一个数据帧,删除重复的行。对列表中的最后两个数据帧重复此操作。然后,结果数据帧再次组合成一个列表。

更新2

此解决方案使用包rbindlist中的data.table。如果您不喜欢这样,结果可以返回为&#34; pure&#34;像这样的数据框

library(data.table)
list(
  setDF(unique(rbindlist(ld[1:2]))),
  setDF(unique(rbindlist(ld[3:4])))
  )

更新3

根据OP的评论,有更多的数据框需要在几个小组中合并。

# set up a list of vectors of numbers of data.frames to combine
dfs_to_combine <- list(c(1:2), c(3:4))
dfs_to_combine

[[1]]
[1] 1 2

[[2]]
[1] 3 4

# now, combine data.frames as specified
library(data.table)
lapply(dfs_to_combine, function(x) setDF(unique(rbindlist(ld[x]))))

[[1]]
  V1 V2
1  B  C
2  A  B
3  Z  B
4  B  D

[[2]]
  V1 V2
1  Z  Y
2  X  Z
3  N  Z
4  Z  J

这只是为了重现您的初始示例。如果你想以不同的方式组合改变数字,例如,

dfs_to_combine <- list(c(1), c(2, 4), c(3))