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

时间:2017-09-11 10:13:53

标签: r dataframe compare-contrast

我有一个像这样的数据框:

Informe de error -
ORA-06550: line 2, column 3:
PLS-00306: wrong number or types of arguments in call to 'CREATE_JOB'
ORA-06550: line 2, column 3:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

经过几个步骤(不重要哪一步)我得到了这个df:

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

我想获得一个新的数据框,只有行在步骤中没有改变;结果将是这一个:

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

我该怎么办?

4 个答案:

答案 0 :(得分:4)

paste的一个选项是将==每个数据集的行放在一起,并比较(dfO[do.call(paste, dfO) == do.call(paste, df),] # X Y Z T #1 1 2 4 2 #3 7 5 NA 3 )以创建我们用于对新数据集进行子集化的逻辑向量

{{1}}

其中'dfO'是旧数据集,'df'是新数据集

答案 1 :(得分:4)

您可以使用dplyr的intersect功能:

library(dplyr)
intersect(d1, d2)
#  X Y  Z T
#1 1 2  4 2
#2 7 5 NA 3

这是基础R的intersect函数的data.frame等价物。

如果您正在使用data.table,该软件包还提供了这样的功能:

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

答案 2 :(得分:3)

另一个dplyr解决方案:semi_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)

答案 3 :(得分:3)

我担心semi joinintersectmerge都不是正确答案。 mergeintersect无法正确处理重复的行。半连接将改变行的顺序。

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

您还可以执行以下操作:

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

但我认为akrun的方式更优雅,并且在速度方面表现更好。