R 根据两个相似df之间的对比度创建一个新的数据帧

R 根据两个相似df之间的对比度创建一个新的数据帧,r,dataframe,compare-contrast,R,Dataframe,Compare Contrast,我有这样一个数据框: X Y Z T 1 2 4 2 3 2 1 4 7 5 NA 3 经过几步(不重要的是哪一步)我得到了这个df: X Y Z T 1 2 4 2 3 2 NA 4 7 5 NA 3 我想获得一个新的数据帧,它只由在步骤中没有改变的行组成;结果是: X Y Z T 1 2 4 2 7 5 NA 3 我该怎么办?使用base R的一个选项是将每个数据集的行粘贴在一起,并比较(=)以创建一个逻辑向量,我们使用该向量

我有这样一个数据框:

  X Y  Z T
  1 2  4 2
  3 2  1 4
  7 5 NA 3
经过几步(不重要的是哪一步)我得到了这个df:

  X Y Z T
  1 2 4 2
  3 2 NA 4
  7 5 NA 3
我想获得一个新的数据帧,它只由在步骤中没有改变的行组成;结果是:

 X  Y  Z  T
 1  2  4  2
 7  5  NA 3

我该怎么办?

使用
base R
的一个选项是
将每个数据集的行粘贴在一起,并比较(
=
)以创建一个逻辑向量,我们使用该向量对新数据集进行子集设置

dfO[do.call(paste, dfO) == do.call(paste, df),]
#   X Y  Z T
#1 1 2  4 2
#3 7 5 NA 3

其中,“dfO”是旧数据集,“df”是新数据集,您可以使用dplyr的
intersect
功能:

library(dplyr)
intersect(d1, d2)
#  X Y  Z T
#1 1 2  4 2
#2 7 5 NA 3
library(data.table)
setDT(d1)
setDT(d2)
fintersect(d1, d2)
#   X Y  Z T
#1: 1 2  4 2
#2: 7 5 NA 3
这是一个data.frame,相当于base R的
intersect
函数

如果您使用的是
data.table
s,该软件包还提供以下功能:

library(dplyr)
intersect(d1, d2)
#  X Y  Z T
#1 1 2  4 2
#2 7 5 NA 3
library(data.table)
setDT(d1)
setDT(d2)
fintersect(d1, d2)
#   X Y  Z T
#1: 1 2  4 2
#2: 7 5 NA 3

另一个
dplyr
解决方案:
semi\u-join

dt1 %>% semi_join(dt2, by = colnames(.))
  X Y  Z T
1 1 2  4 2
2 7 5 NA 3
数据

dt1 <- read.table(text = "X Y  Z T
  1 2  4 2
  3 2  1 4
  7 5 NA 3",
                  header = TRUE, stringsAsFactors = FALSE)

dt2 <- read.table(text = "  X Y Z T
  1 2 4 2
                  3 2 NA 4
                  7 5 NA 3",
                  header = TRUE, stringsAsFactors = FALSE)

dt1恐怕
semi-join
intersect
merge
都不是正确答案<代码>合并
相交
将无法正确处理重复的行。半联接将更改行的顺序

从这个角度来看,我认为到目前为止唯一正确的是akrun的

您还可以执行以下操作:

df1[rowSums(((df1 == df2) | (is.na(df1) & is.na(df2))), na.rm = T) == ncol(df1),]

但我认为akrun的方法更优雅,而且可能在速度方面表现得更好。

只是一个
合并
不是吗-
合并(dt1,dt2)
?@zx8754这可能不是重复,因为根据数据的结构,连接可能不是正确的答案。@ira根据提供的示例数据和预期输出,这是一个由所有列进行的简单的
合并,
,上面的邮件指出了这一点。@zx8754该示例可能会简化。这一行
我想获得一个新的数据帧,它只由在步骤中没有改变的行组成似乎没有请求联接的结果。@zx8754否,merge没有给我预期的结果。Akrun给了我一个解决方案,就是说,如果您没有重复的行或者您不关心行的顺序,那么所有的答案都可以。。。