与R中涉及两个表(数据帧)的SELECT查询相同的是什么?

时间:2016-04-12 23:20:51

标签: r sqlite dataframe

我在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列中的相应行已更新。

任何建议都将不胜感激!

2 个答案:

答案 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查询。非常感谢你的所有建议!