使用 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
子句中。
现在,假设:
Item
在 df1
中是唯一的,Oitem
在 df2
中是唯一的。 (如果不是,请修改问题以解释如何处理重复项。)
df1
和 df2
在最后的注释中重复显示。
- 每一
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
注意: df1
和 df2
以可重现的形式在下面给出。请注意 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)
我有 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
子句中。
现在,假设:
Item
在df1
中是唯一的,Oitem
在df2
中是唯一的。 (如果不是,请修改问题以解释如何处理重复项。)df1
和df2
在最后的注释中重复显示。- 每一
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
注意: df1
和 df2
以可重现的形式在下面给出。请注意 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)