Как объединить два фрейма данных на основе уникальных идентификаторов и изменения / обновления столбца - PullRequest
0 голосов
/ 10 июня 2019

Мне только что дали 2 кадра данных о продажах; В основном фрейме данных хранится вся информация, а во втором - последние продажи за месяц.

Мне нужно объединить информацию из одного фрейма данных в другой на основе уникального идентификатора клиента. В частности, я хотел бы обновить информацию в главном фрейме данных на основе нового df.

Я пытался использовать функцию слияния в R, но у меня есть ошибки при замене информации. Я сделал это слияние в Excel (но это занимает некоторое время, так как у меня много информации).

Фреймы данных выглядят примерно так ...

MainDF
UID       Status      Gender     SaleType
136273    inactive      M        Repair
182732    inactive      F        Product
298372    quit          F        Repair
283715    inactive      M        Product

NewDFtoAdd
UID          Gender     
136273         M
293827         F
283715         F
167643         M

Я хочу взять существующие идентификаторы в главном df и переписать их статус как «активный», если они появляются в NewDFtoAdd.

MainDF
UID       Status      Gender     SaleType
136273    **active**        M        Repair
182732    inactive      F        Product
298372    quit          F        Repair
283715    **active**        F        Product

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

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Мы можем использовать data.table объединение, чтобы заменить 'Status' на 'active', присоединив on к 'UID'

library(data.table)
setDT(MainDF)[NewDFtoAdd, Status := "active", on = .(UID)]
MainDF
#      UID   Status Gender SaleType
#1: 136273   active      M   Repair
#2: 182732 inactive      F  Product
#3: 298372     quit      F   Repair
#4: 283715   active      M  Product

Или используя base R

i1 <- MainDF$UID %in% NewDFtoAdd$UID
MainDF$UID[i1] <- "active"

ПРИМЕЧАНИЕ. Это дает ожидаемый результат.

данные

MainDF <- structure(list(UID = c(136273L, 182732L, 298372L, 283715L), Status = c("inactive", 
"inactive", "quit", "inactive"), Gender = c("M", "F", "F", "M"
), SaleType = c("Repair", "Product", "Repair", "Product")), class = "data.frame", row.names = c(NA, 
-4L))

NewDFtoAdd <- structure(list(UID = c(136273L, 293827L, 283715L, 167643L), Gender = c("M", 
"F", "F", "M")), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 10 июня 2019

Если вы любите dplyr и хотите пойти по этому пути, вы можете сделать это:

library(dplyr)

MainDF%>%
mutate_at(vars(Status), 
        list(~case_when(
          UID %in% NewDFtoAdd$UID ~ "active",
          TRUE ~ Status
        )))

#     UID   Status Gender SaleType
#1 136273   active      M   Repair
#2 182732 inactive      F  Product
#3 298372     quit      F   Repair
#4 283715   active      M  Product
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...