【问题标题】:merge/join two dataframe with different number of columns and rows in R [duplicate]合并/加入R中具有不同列数和行数的两个数据框[重复]
【发布时间】:2017-11-01 14:19:15
【问题描述】:

我有两个 .csv 文件的数据框,如下所示:

data <- data.frame(ID=c(205,206,207,308,310,400,401,35,36,90), 
               year=c(2015, 2015,2015,2015,2015, 2015, 2015, 2015,2015, 2015),
               ghost=c(0,3,0.5,17.5,37.5,0,87.5,0,0,0),
               pumkin=c(3,3,3,3,0,0,37.5,0,0,15),
               pirate=c(3,3,3,3,0,0,37.5,0,87.5,3))   

第二个对不同年份的万圣节服装有不同的观察:

data1 <- data.frame(ID=c(1,12,13,14,15,16,17), 
                year=c(2017,2017,2017,2017,2017,2017,2017),
                ghost=c(0,3,0.5,17.5,37.5,0,87.5),
                mermaid=c(0.5,0.5,37.5,37.5,0,0.5,37.5))

我想要的是一个数据帧,它从两个数据帧中获取所有元素,这些元素将具有这种形式:

ID  year  ghost pumkin pirate mermaid 
205 2015  0
206 2015  3
207 2015  0.5
308 2015  17.5
...  ...
1   2017  0
12  2017  3 
13  2017  0.5

将添加数据框中不存在的列并用零填充。

有没有办法做到这一点? 我已经尝试使用 merge() 和 join() 并且我正在探索使用 dplyr 来操作我的数据框的可能性,但感觉我的问题中有两个问题并且没有简单的方法来做我想做的事。

您的帮助将不胜感激, 万圣节快乐!

【问题讨论】:

    标签: r join merge


    【解决方案1】:

    dplyr::bind_rows 会处理这个

    library(dplyr)
    bind_rows(data,data1) %>% `[<-`(is.na(.),value=0)
    # 1  205 2015   0.0    3.0    3.0     0.0
    # 2  206 2015   3.0    3.0    3.0     0.0
    # 3  207 2015   0.5    3.0    3.0     0.0
    # 4  308 2015  17.5    3.0    3.0     0.0
    # 5  310 2015  37.5    0.0    0.0     0.0
    # 6  400 2015   0.0    0.0    0.0     0.0
    # 7  401 2015  87.5   37.5   37.5     0.0
    # 8   35 2015   0.0    0.0    0.0     0.0
    # 9   36 2015   0.0    0.0   87.5     0.0
    # 10  90 2015   0.0   15.0    3.0     0.0
    # 11   1 2017   0.0    0.0    0.0     0.5
    # 12  12 2017   3.0    0.0    0.0     0.5
    # 13  13 2017   0.5    0.0    0.0    37.5
    # 14  14 2017  17.5    0.0    0.0    37.5
    # 15  15 2017  37.5    0.0    0.0     0.0
    # 16  16 2017   0.0    0.0    0.0     0.5
    # 17  17 2017  87.5    0.0    0.0    37.5 
    

    【讨论】:

    • 这么快,这么简单,谢谢先生!
    • 编辑处理 NAs
    【解决方案2】:

    要获得您想要的输出并根据@Moody_Mudskipper 的回答,您可以这样做

    data2 <- bind_rows(data, data1)
    data2[is.na(data2)] <- 0
    

    【讨论】:

      【解决方案3】:

      要用零填充 NA,您可以这样做:

      library(dplyr)
      bind_rows(data, data1) %>%
        mutate_all(funs(ifelse(is.na(.), 0, .)))
      

      或data.table:

      library(data.table)
      rbindlist(list(data, data1), fill = TRUE)[,lapply(.SD, function(x){ifelse(is.na(x), 0, x)})]
      

      结果:

           ID year ghost pumkin pirate mermaid
       1: 205 2015   0.0    3.0    3.0     0.0
       2: 206 2015   3.0    3.0    3.0     0.0
       3: 207 2015   0.5    3.0    3.0     0.0
       4: 308 2015  17.5    3.0    3.0     0.0
       5: 310 2015  37.5    0.0    0.0     0.0
       6: 400 2015   0.0    0.0    0.0     0.0
       7: 401 2015  87.5   37.5   37.5     0.0
       8:  35 2015   0.0    0.0    0.0     0.0
       9:  36 2015   0.0    0.0   87.5     0.0
      10:  90 2015   0.0   15.0    3.0     0.0
      11:   1 2017   0.0    0.0    0.0     0.5
      12:  12 2017   3.0    0.0    0.0     0.5
      13:  13 2017   0.5    0.0    0.0    37.5
      14:  14 2017  17.5    0.0    0.0    37.5
      15:  15 2017  37.5    0.0    0.0     0.0
      16:  16 2017   0.0    0.0    0.0     0.5
      17:  17 2017  87.5    0.0    0.0    37.5
      

      【讨论】:

        猜你喜欢
        • 2016-10-30
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 2020-12-04
        • 2019-03-31
        • 1970-01-01
        • 2016-05-14
        相关资源
        最近更新 更多