3 回答
TA贡献1828条经验 获得超4个赞
这不会直接回答您的问题,但它会为您提供共同的元素。这可以通过Paul Murrell的包来完成compare:
library(compare)
a1 <- data.frame(a = 1:5, b = letters[1:5])
a2 <- data.frame(a = 1:3, b = letters[1:3])
comparison <- compare(a1,a2,allowAll=TRUE)
comparison$tM
# a b
#1 1 a
#2 2 b
#3 3 c
该函数compare在允许哪种比较方面为您提供了很大的灵活性(例如,改变每个向量的元素顺序,改变变量的顺序和名称,缩短变量,改变字符串的大小写)。由此,您应该能够找出其中一个或哪个缺失的东西。例如(这不是很优雅):
difference <-
data.frame(lapply(1:ncol(a1),function(i)setdiff(a1[,i],comparison$tM[,i])))
colnames(difference) <- colnames(a1)
difference
# a b
#1 4 d
#2 5 e
TA贡献1830条经验 获得超3个赞
SQLDF 提供了一个很好的解决
a1 <- data.frame(a = 1:5, b=letters[1:5])
a2 <- data.frame(a = 1:3, b=letters[1:3])
require(sqldf)
a1NotIna2 <- sqldf('SELECT * FROM a1 EXCEPT SELECT * FROM a2')
以及两个数据框中的行:
a1Ina2 <- sqldf('SELECT * FROM a1 INTERSECT SELECT * FROM a2')
新版本dplyr有一个功能,anti_join正是为了这些类型的比较
require(dplyr)
anti_join(a1,a2)
而semi_join过滤行的a1,同时也是在a2
semi_join(a1,a2)
- 3 回答
- 0 关注
- 740 浏览
添加回答
举报