怎么批量合并 data.frame ?
嗯…,这是个困扰我很久的问题了,想通过指定一个数量 i,就可以合并多少个一样的数据框,今天在做 QPCR-explorer 细节优化的时候想了一下解决了。
分享给大家:
library(tidyverse)library(purrr)# 新建一个数据data.frameda <- data.frame(a=1:2,b=LETTERS[1:2])dadaa b1 1 A2 2 B
假如我们想按行合并 2 次,是不是可以这样做:
rbind(da,da)a b1 1 A2 2 B3 1 A4 2 B
按列合并 2 次:
cbind(da,da)a b a b1 1 A 1 A2 2 B 2 B
这样还不是要自己一个一个打上去?哈哈哈,写个循环试试:
lst <- list()for (i in 1:2) {lst[[i]] <- da}# 合并lst %>% do.call(rbind,.)a b1 1 A2 2 B3 1 A4 2 B# 按列合并lst <- list()for (i in 1:2) {lst[[i]] <- da}# 合并lst %>% do.call(cbind,.)a b a b1 1 A 1 A2 2 B 2 B
看起来是可以的,我们只要把 for 循环里的 2 换成想要合并的次数就可以了。
把代码用 lapply 简化一下:
lst <- list()lapply(1:2, function(x){lst[[x]] <- da}) %>% Reduce(rbind,.)a b1 1 A2 2 B3 1 A4 2 B
也可以用 replicate 函数,感觉这个还挺简洁的:
replicate(2,da,simplify = F) %>% bind_rows()a b1 1 A2 2 B3 1 A4 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)
