如何在R中找到一个数据帧或将其作为子集(完整)匹配到另一个数据帧?

时间:2019-06-11 10:38:56

标签: r dataframe subset matching

我有下面给出的两个数据帧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

以上所有方法给出的数据在两者之间是通用的,但未根据要求给出结果。

请为我建议一些解决方案。

1 个答案:

答案 0 :(得分:1)

您可以像这样使用matchinteraction

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