Как объединить фреймы данных разных размеров и добавить пустые данные? - PullRequest
3 голосов
/ 30 марта 2020

У меня есть df1 с 3000 строк, который выглядит следующим образом:

  Stabr      Area_name      trucks    FIPS
2    IL        Cook          16.8     72000
3    AL Autauga County       13.8     31088
4    CA       Orange         9.8      32080
5    AZ       Maricopa       30.9     4000
6    CA       Los Angeles    21.2     1022

У меня также есть df2 с 1500 строк, который выглядит как:

       county      state  FIPS  cars accidents
2        Cook   Illinois 72000  10435     89
3      Orange California  32080  1547      5
4    Maricopa    Arizona  4000   1571     19
5 Los Angeles California  1022   6759    100

Я бы нравится добавлять столбцы cars и accidents к df1, соответствующие столбцу FIPS. Если в меньшем df2 нет соответствующего FIPS, я бы хотел добавить нули в столбцы cars и `аварий. Конечный продукт будет выглядеть так:

  Stabr      Area_name      cars     FIPS     cars     accidents
2    IL        Cook          16.8     72000   10435     89
3    AL Autauga County       13.8     31088   0         0 
4    CA       Orange         9.8      32080   1547      5
5    AZ       Maricopa       30.9     4000    1571      19
6    CA       Los Angeles    21.2     1022    6759      100

Ответы [ 2 ]

2 голосов
/ 30 марта 2020

In dplyr:

library(dplyr)

df1 %>%
  left_join(df2 %>% select(-state, -county), by = 'FIPS') %>%
  mutate_at(vars(cars, accidents), coalesce, 0L)

Выход:

  Stabr     Area_name trucks  FIPS  cars accidents
1    IL          Cook   16.8 72000 10435        89
2    AL Autauga County   13.8 31088    0         0
3    CA        Orange    9.8 32080  1547         5
4    AZ      Maricopa   30.9  4000  1571        19
5    CA    Los Angeles   21.2  1022 6759       100
1 голос
/ 30 марта 2020

Мы можем использовать join

library(data.table)
setDT(df1)[df2,c('cars', 'accidents') := .(cars, accidents),
      on = .(FIPS)][is.na(cars), c('cars', 'accidents') := .(0, 0)][]
#  Stabr      Area_name trucks  FIPS  cars accidents
#1:    IL           Cook   16.8 72000 10435        89
#2:    AL Autauga County   13.8 31088     0         0
#3:    CA         Orange    9.8 32080  1547         5
#4:    AZ       Maricopa   30.9  4000  1571        19
#5:    CA    Los Angeles   21.2  1022  6759       100

данные

df1 <- structure(list(Stabr = c("IL", "AL", "CA", "AZ", "CA"), Area_name = c("Cook", 
"Autauga County", "Orange", "Maricopa", "Los Angeles"), trucks = c(16.8, 
13.8, 9.8, 30.9, 21.2), FIPS = c(72000L, 31088L, 32080L, 4000L, 
1022L)), class = "data.frame", row.names = c("2", "3", "4", "5", 
"6"))

df2 <- structure(list(county = c("Cook", "Orange", "Maricopa", "Los Angeles"
), state = c("Illinois", "California", "Arizona", "California"
), FIPS = c(72000L, 32080L, 4000L, 1022L), cars = c(10435L, 1547L, 
1571L, 6759L), accidents = c(89L, 5L, 19L, 100L)), class = "data.frame", 
row.names = c("2", 
"3", "4", "5"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...