查看原文
其他

怎么批量合并 data.frame ?

JunJunLab 老俊俊的生信笔记 2022-08-15

缘分也是有保质期的吗?

怎么批量合并 data.frame ?

嗯...,这是个困扰我很久的问题了,想通过指定一个数量 i,就可以合并多少个一样的数据框,今天在做 QPCR-explorer 细节优化的时候想了一下解决了。

分享给大家:

library(tidyverse)
library(purrr)
# 新建一个数据data.frame
da <- data.frame(a=1:2,b=LETTERS[1:2])
da
da
  a b
1 1 A
2 2 B

假如我们想按行合并 2 次,是不是可以这样做:

rbind(da,da)
  a b
1 1 A
2 2 B
3 1 A
4 2 B

按列合并 2 次:

cbind(da,da)
  a b a b
1 1 A 1 A
2 2 B 2 B

这样还不是要自己一个一个打上去?哈哈哈,写个循环试试:

lst <- list()
for (i in 1:2) {
  lst[[i]] <- da
}

# 合并
lst %>% do.call(rbind,.)
  a b
1 1 A
2 2 B
3 1 A
4 2 B

# 按列合并
lst <- list()
for (i in 1:2) {
  lst[[i]] <- da
}

# 合并
lst %>% do.call(cbind,.)
  a b a b
1 1 A 1 A
2 2 B 2 B

看起来是可以的,我们只要把 for 循环里的 2 换成想要合并的次数就可以了。

把代码用 lapply 简化一下:

lst <- list()

lapply(1:2function(x){
       lst[[x]] <- da
       }) %>% Reduce(rbind,.)
  a b
1 1 A
2 2 B
3 1 A
4 2 B

也可以用 replicate 函数,感觉这个还挺简洁的:

replicate(2,da,simplify = F) %>% bind_rows()
  a b
1 1 A
2 2 B
3 1 A
4 2 B

lapply 合并的函数还可以接好多个,结果都是一样的:

lst <- list()

lapply(1:3, function(x){
  lst[[x]] <- da
}) %>% bind_rows()

lapply(1:3, function(x){
  lst[[x]] <- da
}) %>% do.call('rbind',.)

lapply(1:3, function(x){
  lst[[x]] <- da
}) %>% map_dfr(rbind)

应该也还有很多其它的方法,大家自己去探索。

继续推送一下二维码,扫码即可进群:

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,打赏一下吧!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存