R 通过连接多个列来更新列

R 通过连接多个列来更新列,r,dplyr,R,Dplyr,我有两个表,需要从第二个表中的pro_sales值更新第一个表中的pro_sales列值 df1 <- data.frame(storecode = c(100,100,100,200,200), productcode = c(1,2,3,1,2), pro_sales = c(0,0,0,0,0)) df2 <- data.frame(storecode = c(100,100,200), productco

我有两个表,需要从第二个表中的
pro_sales
值更新第一个表中的pro_sales列值

df1 <- data.frame(storecode = c(100,100,100,200,200),
                  productcode = c(1,2,3,1,2), pro_sales = c(0,0,0,0,0))
df2 <- data.frame(storecode = c(100,100,200),
                  productcode = c(1,2,1), pro_sales = c(0,1,0))
我可以离开加入dplyr,但在那之后我需要帮助吗

df1 %>%
  left_join(df2,c("storecode"="storecode","productcode"="productcode")) %>% 
  mutate( ???? ) %>%
  select(names, match, value = value.x)
谢谢。

df1%
df1 <- data.frame(storecode=c(100,100,100,200,200),
                  productcode=c(1,2,3,1,2),pro_sales=c(0,0,0,0,0))
df2 <- data.frame(storecode=c(100,100,200),
                  productcode=c(1,2,1),pro_sales=c(0,1,0))

library(dplyr)

df1 %>%
  left_join(df2, by = c("storecode","productcode")) %>% 
  mutate(pro_sales.y = coalesce(pro_sales.y, 0)) %>%
  select(storecode, productcode, pro_sales = pro_sales.y)

#   storecode productcode pro_sales
# 1       100           1         0
# 2       100           2         1
# 3       100           3         0
# 4       200           1         0
# 5       200           2         0
突变(pro_sales.y=合并(pro_sales.y,0))%>% 选择(storecode、productcode、pro_sales=pro_sales.y) #storecode productcode pro_销售 # 1 100 1 0 # 2 100 2 1 # 3 100 3 0 # 4 200 1 0 # 5 200 2 0

我假设,如您所述,如果要更新给定第二个表的第一个表中的值,则NA值应为零,而不是第一个表中的值。

另一个选项是使用带有
数据的更新联接。table
-包:

library(data.table)
setDT(df1)
setDT(df2)

df1[df2, on = .(storecode, productcode), pro_sales := i.pro_sales][]
其中:


您希望如何处理不在第二个pro_sales列中的列值?将它们设置为零或设置为第一个数据帧中的值。代码示例中使用的列名与数据集中的列(即大写字母)不匹配。非常感谢您的支持。在sqldf update语句中有这样做的方法吗?它主要是一个连接,然后是一个列更新,所以我很确定会有一些等价的东西。不幸的是,我没有太多地使用
sqldf
。也许可以更新您的问题,询问
sqldf
备选方案?还是发布一个新问题?
library(data.table)
setDT(df1)
setDT(df2)

df1[df2, on = .(storecode, productcode), pro_sales := i.pro_sales][]
   storecode productcode pro_sales
1:       100           1         0
2:       100           2         1
3:       100           3         0
4:       200           1         0
5:       200           2         0