使用 R 中的 where 子句使用 Sqldf 选择特定行

Selecting specific rows with Sqldf using where clause in R

我有 2 个数据框,每个数据框有 2 个未排序的列,我想让 sqldf 在 df1 的两行都与 df2 中的行匹配时打印列 (Orep) 的值

这是我仍在构建的起始代码。我被困在 where 子句上,因为它正在生成我想要的输出

library(sqldf)     
df1<- data.frame(mydata1)
df2 <- data.frame(mydata2)

con1<- sqldf ("SELECT Orep FROM df2 Where df1.Item=df2.Oitem And df1.Rep=df2.Orep ")

它给我零行而不是 AS-DA。

当我使用下面的代码时,我得到了我想要的结果,但我需要 where 子句才能工作,因为我还有其他逻辑条件要对查询执行。

sqldf('SELECT * FROM df1 INTERSECT SELECT * FROM df2') 

最后,我想 运行 比较 df1 和 df2 的两列和 return 'match' 或 'No Match' 或最新的查询(如果 df1.item = df2.Oitem 和 df1.Rep=99-99 ) 在一个新列中,像这样

我的数据2
Oitem ------|----Orep|-- 结果
1. BC-GA | XY-RA |没有匹配项
2. CV-DC | XY-RB |没有匹配项
3. CV-DA |阿斯达 |匹配
4. CV-DD | AS-DD |最新

您可以使用 SQL 内部联接:

library(sqldf)

sqldf("select b.Orep from df1 as a
      inner join df2 as b
        on a.Item = b.Oitem and
           a.Rep = b.Orep")

结果:

   Orep
1 AS-DA

数据:

df1 = read.table(text = "Item|Rep  
1.|CV-DA|AS-DA
2.|CV-DB|AS-DB
3.|CV-DC|AS-DC
4.|CV-DD|99-99", header = TRUE, sep = "|", row.names = 1)

df2 = read.table(text = "Oitem|Orep  
1.|BC-GA|XY-RA
2.|CV-DC|XY-RB
3.|CV-DA|AS-DA
4.|CV-DD|AS-DD", header = TRUE, sep = "|", row.names = 1)

问题中第一个 select 的问题是它尝试使用 df1,即使它不在 from 子句中。

现在,假设:

  • Itemdf1 中是唯一的,Oitemdf2 中是唯一的。 (如果不是,请修改问题以解释如何处理重复项。)
  • df1df2 在最后的注释中重复显示。
  • 每一 df2 行应该有一个输出行。

那么我们有:

library(sqldf)

sqldf("select 
       df2.*,
       case 
        when Item = OItem and Rep = ORep then 'Match'
        when Item = OItem and Rep = '99-99' then 'Latest'
        else 'Nomatch' 
       end Results
       from df2 left join df1 on Item = Oitem")

给予:

  Oitem  Orep Results
1 BC-GA XY-RA Nomatch
2 CV-DC XY-RB Nomatch
3 CV-DA AS-DA   Match
4 CV-DD AS-DD  Latest

注意: df1df2 以可重现的形式在下面给出。请注意 read.csv 默认为 header = TRUE.

Lines1 <- "
Item | Rep
CV-DA | AS-DA
CV-DB | AS-DB
CV-DC | AS-DC
CV-DD | 99-99"
df1 <- read.csv(text = Lines1, as.is = TRUE, sep = "|", strip.white = TRUE)

Lines2 <- "
Oitem | Orep
BC-GA | XY-RA
CV-DC | XY-RB
CV-DA | AS-DA
CV-DD | AS-DD"
df2 <- read.csv(text = Lines2, as.is = TRUE, sep = "|", strip.white = TRUE)