我刚刚得到2个销售数据帧;主要数据框包含所有信息,第二个数据框包含该月的最新销售额。
我需要根据客户端的唯一ID将信息从一个数据帧合并到另一个数据帧。具体来说,我想根据新的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
我想将现有ID放入主DF中,如果它们出现在NewDFtoAdd中,则将其状态重写为“活动”。
MainDF
UID Status Gender SaleType
136273 **active** M Repair
182732 inactive F Product
298372 quit F Repair
283715 **active** F Product
我真的很想用R编写代码;因此,有了新数据,我就可以进行相应的更新,并且我的分析代码可以继续。
答案 0 :(得分:1)
我们可以使用data.table
联接通过将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))
答案 1 :(得分:0)
如果您爱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