Pertanyaan Apakah ada metode R dplyr untuk menggabungkan dengan semua = BENAR?


Saya memiliki dua R dataframe yang ingin saya gabungkan. Dalam R lurus Anda dapat melakukan:

cost <- data.frame(farm=c('farm A', 'office'), cost=c(10, 100))
trees <- data.frame(farm=c('farm A', 'farm B'), trees=c(20,30))
merge(cost, trees, all=TRUE)

yang menghasilkan:

    farm cost trees
1 farm A   10    20
2 office  100    NA
3 farm B   NA    30

saya menggunakan dplyr, dan lebih suka solusi seperti:

left_join(cost, trees)

yang menghasilkan sesuatu yang dekat dengan apa yang saya inginkan:

    farm cost trees
1 farm A   10    20
2 office  100    NA

Di dplyr saya dapat melihat left_join, inner_join, semi_join dan anti-join, tetapi tidak ada yang melakukan apa merge dengan all=TRUE tidak.

Juga - apakah ada cara cepat untuk mengatur NAs ke 0? Upaya saya sejauh ini menggunakan x$trees[is.na(x$trees)] <- 0; melelahkan (saya butuh perintah per kolom) dan sepertinya tidak selalu berhasil.

Terima kasih


32
2018-02-17 23:09


asal


Jawaban:


Versi terbaru dari dplyr (0.4.0) sekarang memiliki opsi full_join, yang saya yakini Anda inginkan.

cost <- data.frame(farm=c('farm A', 'office'), cost=c(10, 100))
trees <- data.frame(farm=c('farm A', 'farm B'), trees=c(20,30))
merge(cost, trees, all=TRUE)

Pengembalian

> merge(cost, trees, all=TRUE)
        farm cost trees
    1 farm A   10    20
    2 office  100    NA
    3 farm B   NA    30

Dan

library(dplyr)
full_join(cost, trees)

Pengembalian

> full_join(cost, trees)
Joining by: "farm"
    farm cost trees
1 farm A   10    20
2 office  100    NA
3 farm B   NA    30
Warning message:
joining factors with different levels, coercing to character vector

25
2018-01-14 04:26



library(plyr)
> dat <- join(cost, trees, type = "full")
Joining by: farm
> dat
    farm cost trees
1 farm A   10    20
2 office  100    NA
3 farm B   NA    30

> dat[is.na(dat)] <- 0
> dat
    farm cost trees
1 farm A   10    20
2 office  100     0
3 farm B    0    30

1
2017-07-28 08:39