【问题标题】:merging more than 2 data frames whilst assigning an identifier factor in R合并超过 2 个数据帧,同时在 R 中分配标识符因子
【发布时间】:2017-10-02 12:45:24
【问题描述】:

拿这个很简单的RWE,我想知道当我们合并两个或多个data.frames时,可以使用什么包来自动分配一个因子(最好是数据框名称)

我在下面的示例中手动定义了因子并显示了所需的输出。但我想自动化它,因为我有 100 多个表要合并。请注意,每个 df 中的标题是不变的,只有名称本身会发生变化

A <- 1:5
B <- 5:1

df1 <- data.frame(A,B)

A <- 2:6
B <- 6:2

df2 <- data.frame(A,B)

df1$ID <- rep("df1", 5)
df2$ID <- rep("df2", 5)

big_df <- rbind(df1,df2)

【问题讨论】:

    标签: r dataframe reduce rowname


    【解决方案1】:

    假设您的 data.frame 名称遵循某种模式,例如以“df”开头后跟数字,并且它们不在列表中而只是在您的全局环境中,您可以使用以下内容:

    library(data.table)
    bigdf <- rbindlist(Filter(is.data.frame, mget(ls(pattern = "^df\\d+"))), id = "ID")
    

    没有data.table,你可以这样做:

    lst <- Filter(is.data.frame, mget(ls(pattern = "^df\\d+")))
    bigdf <- do.call(rbind, Map(function(df, id) transform(df, ID=id), lst, names(lst)))
    

    【讨论】:

    • 很棒的 hack,我知道一定有一个简单的方法。非常感谢
    【解决方案2】:

    考虑以下几点:

    library(dplyr)
    cof_df <- bind_rows(df1, df2, .id="ID")
    cof_df
       ID A B
    1   1 1 5
    2   1 2 4
    3   1 3 3
    4   1 4 2
    5   1 5 1
    6   2 2 6
    7   2 3 5
    8   2 4 4
    9   2 5 3
    10  2 6 2
    

    然后:

    cof_df$ID <- factor(cof_df$ID, 
                        levels = c(1,2),
                        labels = paste0("df", unique(cof_df$ID)))
    

    进行重新编码。

    通过命名bind_rows中的参数可以得到类似的结果,如

    cof_df <- bind_rows(df1=df1, df2=df2, .id="ID")
    

    【讨论】:

      【解决方案3】:

      另一种解决方案是使用合并:

      merged <- merge(df1, df2, all=TRUE, sort =FALSE)
      
      > merged
         A B  ID
      1  1 5 df1
      2  2 4 df1
      3  3 3 df1
      4  4 2 df1
      5  5 1 df1
      6  2 6 df2
      7  3 5 df2
      8  4 4 df2
      9  5 3 df2
      10 6 2 df2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        • 2013-05-16
        相关资源
        最近更新 更多