【问题标题】:Is there a way to bind multiple dataframes by a named list?有没有办法通过命名列表绑定多个数据帧?
【发布时间】:2021-02-27 15:20:13
【问题描述】:

如果以前有人问过这个问题,请原谅我,但我无法输入正确的搜索词来找到其他有此问题的人。

使用循环,我创建了一个数据框名称列表。我要做的是使用该列表的引用,以便 rbind 将相应的数据帧附加在一起。下面是我正在尝试做的一个例子:

list <- list("df1","df2","df3") #represents the list of names of the dataframes 
all_df <- rbind(list)

上面只是将数据帧的名称附加在一起,而不是数据帧本身。我也试过:

all_df <- rbindlist(list)

all_df <- do.call(what = rbind, args = list)

但没有运气。我能找到的所有建议似乎都是指数据框列表,而不是数据框名称列表。

请帮忙!我正在为此烦恼,因为我知道解决方案可能真的很简单!

【问题讨论】:

标签: r list rbind


【解决方案1】:

如果我理解正确,您有一个字符向量,其中包含您要绑定的对象的名称。 您的目标是使用“名称向量”将多个数据帧绑定到单个数据帧中。

我可以建议使用mget() 函数将您的字符向量转换为实际对象的名称吗?这不需要列出清单。

请看下面的代码:

# dummy data to test it
df1 <- head(mtcars, 2)
df2 <- head(mtcars, 3)
df3 <- head(mtcars, 4)

# your "vector of names"
lst.names <- list("df1","df2","df3") # the output of your loop
df.names <- do.call(rbind, lst.names)[, 1] # change the list to a character vector

# this seems to work
do.call(rbind, mget(df.names)) 

输出:

> do.call(rbind, mget(df.names)) 
                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
df1.Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
df1.Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
df2.Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
df2.Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
df2.Datsun 710     22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
df3.Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
df3.Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
df3.Datsun 710     22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
df3.Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1

【讨论】:

  • 感谢您的帮助!我试过了,但得到了错误:mget(list) 中的错误:第一个参数无效
  • @asbhopal1 请您发布typeof(df.names) 的输出吗?根据?mget,这必须是“对象名称的字符向量”。例如:这工作do.call(rbind, mget(list(df.names))) 但这个确实工作:do.call(rbind, mget(df.names)) df.names &lt;- c("df1", "df2", "df3")
  • 嗨,保罗。 Typeof 显示为“列表”。并且仍然收到无效的第一个参数错误:(
  • 好的,要让这段代码工作,你需要有一个vector,而不是mget() 中的一个列表。只需将list("df1","df2","df3") 更改为c("df1", "df2", "df3")。但是,正如您提到的,您从循环中获取此列表,我将编辑答案以向您展示如何从 list("df1","df2","df3") 检索此类向量
  • @asbhopal1 我已经编辑了代码,将list("df1","df2","df3") 转换为c("df1", "df2", "df3")
【解决方案2】:

例子:

library(rlist)

textdfs <- list('mtcars', 'mtcars', 'mtcars')
mylist <- lapply(textdfs, function(x) eval(parse(text=x)))
bigdf <- list.rbind(mylist)

【讨论】:

  • 恐怕不行。只是将名称列表绑定在一起,而不是我希望它们引用的数据框
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多