Извлечение недостающей стоимости - PullRequest
0 голосов
/ 23 января 2019

У меня есть два набора данных, и их dput ниже:

Сценарий: df1 содержит данные о единичных ценах на определенные даты и время. df2 содержит код конкурента для каждой станции в df1, а также цены и название бренда конкурента. У df2 нет всех цен за единицу для дат и времени в df1. Мне нужно каким-то образом объединить df2 в df1 так, чтобы я получал дату, время, продукт, ServiceType & Brand, но NA в единичных ценах для конкурентов, чтобы я мог вычислить эти значения после.

Я пытаюсь сделать следующее:

  1. Узнайте, какие цены за единицу даты и времени отсутствуют в df2 на основе значений в df1, обусловленных аналогичным кодом станции, типом продукта и услуги. Каждый код станции в df1 имеет несколько «кодов станций» в df2, поскольку может быть более одного участника.

  2. Каким-то образом извлеките и объедините эту информацию, чтобы я мог вычислить значения после.

Предположим, df1 равен

 date StationCode  ServiceType Product unitprice
1 2017-06-01 06:00:00        1002 Self-Service      GG     1.345
2 2017-06-01 07:00:00        1002       Served      GG     1.456
3 2017-06-01 07:00:00        1002 Self-Service      SP     1.012 
dput(df1) 


structure(list(date = structure(c(1496300400,
     1496304000, 1496304000 ), class = c("POSIXct", "POSIXt"), tzone =
     "Etc/GMT+1"), StationCode = c(1002,  1002, 1002), ServiceType =
     structure(c(1L, 2L, 1L), .Label = c("Self-Service",  "Served"), class
     = "factor"), Product = structure(c(1L, 1L, 2L ), .Label = c("GG", "SP"), class = "factor"), unitprice = c(1.345, 
     1.456, 1.012)), class = "data.frame", row.names = c(NA, -3L))

и df2 равен

date compstcode StationCode  ServiceType Product unitprice brand
1 2017-06-01 06:00:00       3456        1002 Self-Service      GG     1.425 Shell
2 2017-06-01 06:00:00       1267        1002       Served      SP     1.406    BP
3 2017-06-01 06:00:00       5488        1002 Self-Service      GG     1.011 Total

dput(df2)
    structure(list(date = structure(c(1496300400, 1496300400, 1496300400
), class = c("POSIXct", "POSIXt"), tzone = "Etc/GMT+1"), compstcode = c(3456, 
1267, 5488), StationCode = c(1002, 1002, 1002), ServiceType = structure(c(1L, 
2L, 1L), .Label = c("Self-Service", "Served"), class = "factor"), 
    Product = structure(c(1L, 2L, 1L), .Label = c("GG", "SP"), class = "factor"), 
    unitprice = c(1.425, 1.406, 1.011), brand = structure(c(2L, 
    1L, 3L), .Label = c("BP", "Shell", "Total"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

Я хочу извлечь compstcode, uprice и brand из df2 в df1 так, чтобы у нас был compstcode и brand not null, тогда как uprice может быть нулевым для всех дат и времен df1.

1 Ответ

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

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

library(tidyverse)

df1 %>% left_join(., df2 %>% select(-date), by = c("StationCode", "ServiceType", "Product"))

                 date StationCode  ServiceType Product unitprice.x compstcode unitprice.y brand
1 2017-06-01 06:00:00        1002 Self-Service      GG       1.345       3456       1.425 Shell
2 2017-06-01 06:00:00        1002 Self-Service      GG       1.345       5488       1.011 Total
3 2017-06-01 07:00:00        1002       Served      GG       1.456         NA          NA  <NA>
4 2017-06-01 07:00:00        1002 Self-Service      SP       1.012         NA          NA  <NA>

Но вам не нужно исключать дату, это также может быть (переименование столбцов для ясности):

df1 %>% left_join(., df2 %>% rename(compDate = date, compunitprice = unitprice), by = c("StationCode", "ServiceType", "Product"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...