Проблемы объединения наборов данных на R - PullRequest
0 голосов
/ 17 января 2019

У меня есть набор данных, содержащий переменные и количество проданных товаров: однако в течение нескольких дней значения отсутствуют.

Я создал набор данных со всеми 0 значениями в продажах и всеми NA в остальных. Как я могу добавить эти строки в исходный набор данных?

На данный момент у меня есть это:

sales
day    month    year    employees    holiday    sales
1      1        2018    14           0          1058
2      1        2018    25           1          2174 
4      1        2018    11           0          987

sales.NA
day    month    year    employees    holiday    sales
1      1        2018    NA           NA         0
2      1        2018    NA           NA         0
3      1        2018    NA           NA         0
4      1        2018    NA           NA         0

Я хотел бы создать новый набор данных, добавив дни, когда у меня нет наблюдений, значение 0 для продаж и NA для всех остальных переменных. Как это

new.data
day    month    year    employees    holiday    sales
1      1        2018    14           0          1058
2      1        2018    25           1          2174 
3      1        2018    NA           NA         0
4      1        2018    11           0          987

Я пытался использовать что-то вроде этого

merge(sales.NA,sales, all.y=T, by = c("day","month","year"))

Но это не работает

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Вот еще одно data.table решение:

jvars = c("day","month","year")
merge(sales.NA[, ..jvars], sales, by = jvars, all.x = TRUE)[is.na(sales), sales := 0L][]

   day month year employees holiday sales
1:   1     1 2018        14       0  1058
2:   2     1 2018        25       1  2174
3:   3     1 2018        NA      NA     0
4:   4     1 2018        11       0   987

Или с более точным синтаксисом:

sales[sales.NA[, ..jvars], on = jvars][is.na(sales), sales := 0][]

Воспроизводимые данные:

sales <- structure(list(day = c(1L, 2L, 4L), month = c(1L, 1L, 1L), year = c(2018L, 
2018L, 2018L), employees = c(14L, 25L, 11L), holiday = c(0L, 
1L, 0L), sales = c(1058L, 2174L, 987L)), row.names = c(NA, -3L
), class = c("data.table", "data.frame"))
sales.NA <- structure(list(day = 1:4, month = c(1L, 1L, 1L, 1L), year = c(2018L, 
2018L, 2018L, 2018L), employees = c(NA, NA, NA, NA), holiday = c(NA, 
NA, NA, NA), sales = c(0L, 0L, 0L, 0L)), row.names = c(NA, -4L
), class = c("data.table", "data.frame"))
0 голосов
/ 17 января 2019

Используя dplyr, вы можете использовать "right_join". Например:

sales <- data.frame(day = c(1,2,4), 
                    month = c(1,1,1),
                    year = c(2018, 2018, 2018),
                    employees = c(14, 25, 11), 
                    holiday = c(0,1,0), 
                    sales = c(1058, 2174, 987)
                    )

sales.NA <- data.frame(day = c(1,2,3,4),
                       month = c(1,1,1,1), 
                       year = c(2018,2018,2018, 2018)
                       )

right_join(sales, sales.NA)

Это оставляет вас с

  day month year employees holiday sales
1   1     1 2018        14       0  1058
2   2     1 2018        25       1  2174
3   3     1 2018        NA      NA    NA
4   4     1 2018        11       0   987

Это оставляет NA в продажах там, где вы хотите 0, но это можно исправить, включив данные о продажах в sales.NA, или вы можете использовать "tidyr"

right_join(sales, sales.NA) %>% mutate(sales = replace_na(sales, 0))
0 голосов
/ 17 января 2019

Это ответ с использованием пакета data.table, так как я более знаком с синтаксисом, но обычные data.frames должны работать примерно так же. Я также переключился бы на правильный формат даты, который облегчит вам жизнь в будущем. На самом деле, таким образом, вам не понадобится таблица Sales.NA, поскольку она будет автоматически решаться всеми днями, которые имеют NA после первого соединения.

library(data.table)


dt.dates <- data.table(Date = seq.Date(from = as.Date("2018-01-01"), to = as.Date("2018-12-31"),by = "day"  ))
dt.sales <- data.table(day = c(1,2,4)
                       , month = c(1,1,1)
                       , year = c(2018,2018,2018)
                       , employees = c(14, 25, 11)
                       , holiday = c(0,1,0)
                       , sales = c(1058, 2174, 987)
                       )


dt.sales[, Date := as.Date(paste(year,month,day, sep = "-")) ]

merge( x = dt.dates
       , y = dt.sales
       , by.x = "Date"
       , by.y = "Date"
       , all.x = TRUE
)
>             Date day month year employees holiday sales
    1: 2018-01-01   1     1 2018        14       0  1058
    2: 2018-01-02   2     1 2018        25       1  2174
    3: 2018-01-03  NA    NA   NA        NA      NA    NA
    4: 2018-01-04   4     1 2018        11       0   987
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...