Combine data frames from a vector of names

独自空忆成欢 提交于 2021-02-16 21:27:18

问题


I have an issue that I thought easy to solve, but I did not manage to find a solution. I have a large number of data frames that I want to bind by rows. To avoid listing the names of all data frames, I used "paste0" to quickly create a vector of names of the data frames. The problem is that I do not manage to make the rbind function identify the data frames from this vector of name. More explicitely:

df1 <- data.frame(x1 = sample(1:5,5), x2 =  sample(1:5,5))
df2 <- data.frame(x1 = sample(1:5,5), x2 =  sample(1:5,5))
idvec <- noquote(c(paste0("df",c(1,2))))
> [1] df1 df2

What I would like to get:

dftot <- rbind(df1,df2)
   x1 x2
1   4  1
2   5  2
3   1  3
4   3  4
5   2  5
6   5  3
7   1  4
8   2  2
9   3  5
10  4  1

dftot <- rbind(idvec)
>       [,1]  [,2] 
> idvec "df1" "df2"

回答1:


If there are multiple objects in the global environment with the pattern df followed by digits, one option is using ls to find all those objects with the pattern argument. Wrapping it with mget gets the values in the list, which we can rbind with do.call.

v1 <- ls(pattern='^df\\d+')
`row.names<-`(do.call(rbind,mget(v1)), NULL)

If we know the objects, another option is paste to create a vector of object names and then do as before.

v1 <- paste0('df', 1:2)
 `row.names<-`(do.call(rbind,mget(v1)), NULL)



回答2:


This should give the result:

dfcount <- 2
dftot <- df1 #initialise
for(n in 2:dfcount){dftot <- rbind(dftot, eval(as.name(paste0("df", as.character(n)))))}

eval(as.name(variable_name)) reads the data frames from strings matching their names.



来源:https://stackoverflow.com/questions/31476194/combine-data-frames-from-a-vector-of-names

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!