合并/连接R中具有不同列数和行数的两个数据帧

时间:2017-11-01 14:19:16

标签: r join merge

我有两个数据帧是.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来操作我的数据帧的可能性,但感觉我的问题有两个问题,并没有简单的方法来做我想要的。

非常感谢您的帮助, 万圣节快乐!

3 个答案:

答案 0 :(得分:2)

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 

答案 1 :(得分:0)

获取所需的输出并根据@ Moody_Mudskipper的答案你可以做到

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

答案 2 :(得分:0)

要用零填充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