如何将一个数据框作为子集(完整)查找或匹配到 R 中的另一个数据框?
how find or match one data frame as a subset(full) into another data frame in R?
下面给出了两个数据框 df1 和 df2。
df1
是
c1 c2 c3 c4
B 2.34000 1.00 I
A 14.43000 2.10 J
D 3.45515 1.00 K
B 2.50000 2.09
A 2.44000 1.10 K
K 5.00000 1.09 L
df2
是:
c1 c2 c3
B 2.34 1.00
A 14.43 2.10
D 3.43 1.00
B 2.50 2.09
E 5.00 1.09
A 2.44 1.10
这里的要求是这样的:这两个数据帧之间存在匹配(或比较)。如果 df2
完全找到(这意味着 df2
的内容与 df1
的任何子集匹配,而不管顺序 )在 df1
(与 df2
完全匹配或 df1
的子集与 df2
匹配)则输出为 true
。如果不匹配则 return false
。
我尝试了以下方法:
1. left_join(df2,df1)
2. merge(df2,df1)
3. inner_join(df2,df1)
4. dd1[dd1$c1 %in% dd$c1,]
以上所有方法都给出了两者之间共有的数据,但没有根据要求给出结果。
请给我一些解决方案。
您可以像这样使用 match
和 interaction
:
df1 <- read.table(text="c1 c2 c3 c4
B 2.34000 1.00 I
A 14.43000 2.10 J
D 3.45515 1.00 K
B 2.50000 2.09 NA
A 2.44000 1.10 K
K 5.00000 1.09 L", header=T)
df2 <- read.table(text="c1 c2 c3
B 2.34 1.00
A 14.43 2.10
D 3.43 1.00
B 2.50 2.09
E 5.00 1.09
A 2.44 1.10", header=T)
!any(is.na(match(interaction(df2), interaction(df1[names(df2)]))))
#[1] FALSE
#And packed in a function
"%completelyFoundIn%" <- function(x, y) {!any(is.na(match(interaction(x), interaction(y[names(x)]))))}
df2 %completelyFoundIn% df1
#[1] FALSE
df2[c(1,2,4,6),] %completelyFoundIn% df1
#[1] TRUE
df2[-5,c(1,3)] %completelyFoundIn% df1
#[1] TRUE
下面给出了两个数据框 df1 和 df2。
df1
是
c1 c2 c3 c4
B 2.34000 1.00 I
A 14.43000 2.10 J
D 3.45515 1.00 K
B 2.50000 2.09
A 2.44000 1.10 K
K 5.00000 1.09 L
df2
是:
c1 c2 c3
B 2.34 1.00
A 14.43 2.10
D 3.43 1.00
B 2.50 2.09
E 5.00 1.09
A 2.44 1.10
这里的要求是这样的:这两个数据帧之间存在匹配(或比较)。如果 df2
完全找到(这意味着 df2
的内容与 df1
的任何子集匹配,而不管顺序 )在 df1
(与 df2
完全匹配或 df1
的子集与 df2
匹配)则输出为 true
。如果不匹配则 return false
。
我尝试了以下方法:
1. left_join(df2,df1)
2. merge(df2,df1)
3. inner_join(df2,df1)
4. dd1[dd1$c1 %in% dd$c1,]
以上所有方法都给出了两者之间共有的数据,但没有根据要求给出结果。
请给我一些解决方案。
您可以像这样使用 match
和 interaction
:
df1 <- read.table(text="c1 c2 c3 c4
B 2.34000 1.00 I
A 14.43000 2.10 J
D 3.45515 1.00 K
B 2.50000 2.09 NA
A 2.44000 1.10 K
K 5.00000 1.09 L", header=T)
df2 <- read.table(text="c1 c2 c3
B 2.34 1.00
A 14.43 2.10
D 3.43 1.00
B 2.50 2.09
E 5.00 1.09
A 2.44 1.10", header=T)
!any(is.na(match(interaction(df2), interaction(df1[names(df2)]))))
#[1] FALSE
#And packed in a function
"%completelyFoundIn%" <- function(x, y) {!any(is.na(match(interaction(x), interaction(y[names(x)]))))}
df2 %completelyFoundIn% df1
#[1] FALSE
df2[c(1,2,4,6),] %completelyFoundIn% df1
#[1] TRUE
df2[-5,c(1,3)] %completelyFoundIn% df1
#[1] TRUE