我在R中设置的sqldf默认使用SQLite。我尝试了以下查询但没有成功:
query = "UPDATE t1
SET Actual = t2.AvgRevenue,
Total = t2.AvgRevenue
WHERE Name=t2.Name AND
Pillar= 'HW' AND
(Status <> 'Lost') AND
Revenue=0"
t1 = sqldf(c(query,"select * from pl0"))
t1列有名称,支柱,状态,收入,实际,总计 t2是一个包含Name,AvgRevenue
列的查找表在做了一些研究之后,我发现SQLite目前不支持涉及两个或更多表的UPDATE查询。
我的问题是:我可以仅使用R?
执行上述查询为了得到答案,我尝试了以下方法:
test <- t1[t1$Revenue == 0 & t1$Status == 'Lost' & t1$Pillar == 'HW',]
test$Actual <- test$Name
mapvalues(test$Actual,
t2$Name,
t2$AvgRevenue,
warn_missing = FALSE)
t1 <- test
但mapvalues没有像我预期的那样更新列测试$ Actual。 t2 $ AvgRevenue的正确值将输出到控制台,但测试$ Actual不会更新。顺便说一句,我希望t1与以前的数据框相同,但是在Actual和Total列中的相应行已更新。
任何建议都将不胜感激!
答案 0 :(得分:0)
您可以使用dplyr库来选择变量:
library(dplyr)
Actual <- select(t1, Name, Pillar, Status, Revenue)
Avg_Revenue < select(t2, Name, AvgRevenue)
complete_data = cbind(Actual, Avg_Revenue)
您也可以使用过滤器:
filter(Actual, Revenue==0, Status =="lost")
希望有所帮助
答案 1 :(得分:0)
我根据R找到了我的问题的答案。这是:
t1 <- data.frame(Name=c("A","B","C","D"),
Pillar=c("SW","HW","HW","SW"),
Status=c("Won","Open","Won","Lost"),
Revenue=c(5,0,0,0),
Actual=c(5,0,0,0),
Total=c(5,0,0,0))
t2 <- data.frame(Name=c("A","B","C","D"),
AvgRevenue=c(5,3,7,10))
t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',]$Actual <-
as.character(t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',]$Name)
t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',"Actual"] <-
mapvalues(t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',"Actual"],
t2$Name,
t2$AvgRevenue,
warn_missing = FALSE)
t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',"Total"] <-
as.character(t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',"Name"])
t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',"Total"] <-
mapvalues(t1[t1$Revenue == 0 & t1$Status != 'Lost' & t1$Pillar == 'HW',"Total"],
t2$Name,
t2$AvgRevenue,
warn_missing = FALSE)
t1
诀窍是使用t1和amp;之间的公共密钥。 t2(Name)作为能够使用mapvalues完成最后一步的中间步骤。这相当于原始的SQL UPDATE查询。非常感谢你的所有建议!