我有下面给出的两个数据帧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
这里的需求是这样的:这两个数据帧之间存在匹配(或比较)。如果完全找到{{1}中的df2
(这意味着df2
的内容与df1
的任何子集相匹配,而与顺序无关)与df1
匹配或df2
的子集与df1
匹配),则输出为df2
。如果不匹配,则返回true
。
我尝试了以下方法:
false
以上所有方法给出的数据在两者之间是通用的,但未根据要求给出结果。
请为我建议一些解决方案。
答案 0 :(得分:1)
您可以像这样使用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