怎么批量合并 data.frame ?

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

分享给大家:

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

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

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

按列合并 2 次:

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

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

  1. lst <- list()
  2. for (i in 1:2) {
  3. lst[[i]] <- da
  4. }
  5. # 合并
  6. lst %>% do.call(rbind,.)
  7. a b
  8. 1 1 A
  9. 2 2 B
  10. 3 1 A
  11. 4 2 B
  12. # 按列合并
  13. lst <- list()
  14. for (i in 1:2) {
  15. lst[[i]] <- da
  16. }
  17. # 合并
  18. lst %>% do.call(cbind,.)
  19. a b a b
  20. 1 1 A 1 A
  21. 2 2 B 2 B

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

把代码用 lapply 简化一下:

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

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

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

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

  1. lst <- list()
  2. lapply(1:3, function(x){
  3. lst[[x]] <- da
  4. }) %>% bind_rows()
  5. lapply(1:3, function(x){
  6. lst[[x]] <- da
  7. }) %>% do.call('rbind',.)
  8. lapply(1:3, function(x){
  9. lst[[x]] <- da
  10. }) %>% map_dfr(rbind)