【问题标题】:rbind data frames based on a common pattern in data frame namerbind 基于数据框名称中的通用模式的数据框
【发布时间】:2017-06-08 06:39:10
【问题描述】:

假设我有多个数据帧,它们都具有相同的向量名称,我想 cbind 所有具有共同模式的数据帧。所以对于这 3 个数据帧:

df.1 <- data.frame(column1 = factor(sample(c("Male","Female"), 10, replace=TRUE)),
                   speed=runif(10))
df.2 <- data.frame(column1 = factor(sample(c("Male","Female"), 10, replace=TRUE)),
                   speed=runif(10))
df.3 <- data.frame(column1 = factor(sample(c("Male","Female"), 10, replace=TRUE)),
                   speed = runif(10))

我想rbind 使用通用模式“df.*”的所有内容

我尝试创建一个列表,然后使用以下方法创建一个数据框:

temp <- lapply(ls(pattern = "df.*"), get) 
temp2<- as.data.frame(temp)

然而,这只会产生一个 6 列的数据框,有效地 cbinding 整个事物而不是 rbinding。

【问题讨论】:

    标签: r dataframe apply rbind


    【解决方案1】:

    我们可以使用lsmget

    library(data.table)
    rbindlist(mget(ls(pattern = "^df\\.\\d+")))
    

    dplyr

    library(dplyr)
    mget(ls(pattern="^df\\.\\d+")) %>%
                  bind_rows()
    

    或者用rbind 来自base R

    do.call(rbind, mget(ls(pattern="^df\\.\\d+")))
    

    【讨论】:

    • 完美,谢谢。问题:为什么使用"^df\\.\\d+" 而不是"df.*"
    • @JojoOno 根据您创建的对象,df.1df.2df.3 等,我认为这些模式会非常具体,即开头的“df”(^)字符串,后跟.(这是一个元字符,表示任何字符都可以匹配,所以我们转义(\` it), followed by one or more digits (\\d+`)。
    • 所以这避免了在全球环境中的任何地方使用"df."附加任何其他对象的可能性?
    • @JojoOno 假设你的对象是dframdfxyz 它不会捡起它
    • 好的,太棒了。谢谢你的澄清。
    【解决方案2】:

    你可以试试:

    new_df <- do.call("rbind",mget(ls(pattern = "^df.*")))
    

    【讨论】:

      猜你喜欢
      • 2013-02-16
      • 2018-06-04
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2018-05-27
      • 2016-10-27
      • 1970-01-01
      • 2014-02-03
      相关资源
      最近更新 更多