我有一个像这样的数据框:
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
我该怎么办?
答案 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 join
,intersect
或merge
都不是正确答案。 merge
和intersect
无法正确处理重复的行。半连接将改变行的顺序。
从这个角度来看,我认为到目前为止唯一正确的是akrun。
您还可以执行以下操作:
df1[rowSums(((df1 == df2) | (is.na(df1) & is.na(df2))), na.rm = T) == ncol(df1),]
但我认为akrun的方式更优雅,并且在速度方面表现更好。