R通过字符变量中元素出现的差异来比较数据帧

时间:2014-11-05 10:34:43

标签: r compare dataframe

1提供两个数据帧如何找到数据帧之间变量/列中元素出现次数不同的行。例如,给定两个数据框:

df1 <- data.frame(
    id=c(1,2,3,4),
    score=c("AA","BB","BB","BA"))


df2 <- data.frame(
    id=c(1,2,3,4,5,6),
    score=c("AA","BB","BB","BB","BA","BC"))

可以找到得分中每个字符串的出现次数,并通过例如逐行添加到df1。

library('dplyr')
df1 <- join(df1, ddply(df1, .(score), 'nrow'))

但是如何获得df1的子集,其中只包含df2中出现不同分数的行?我期望结果由行2和3(id 2和3)组成,因为“BB”在df1中出现2次而在df2中出现3次,而“AA”和“BA”在每个df中出现1次。显然,如果我们在df1中要求df2

,预计会有另一个结果

1 个答案:

答案 0 :(得分:1)

在这里,我们可以使用frequency检查每个数据集的score table。然后,使用namestables中查找两个数据集共有的intersect。一旦完成,我们想要找到这些通用名称中的哪些频率彼此不同,以及预期数据集中不在通用名称中的table的名称。使用c连接两者,然后检查数据集中具有这些值的scores以对数据集进行子集化。

tb1 <- table(df1[,2])
tb2 <- table(df2[,2])
int <- intersect(names(tb1), names(tb2))
df1[df1$score %in%int[tb1[int]!=tb2[int]],]
#  id score
#2  2    BB
#3  3    BB

df2[df2$score %in% c(setdiff(names(tb2), int), int[tb1[int]!=tb2[int]]),]
#    id score
#2  2    BB
#3  3    BB
#4  4    BB
#6  6    BC

修改

您可以将其包装在函数

 f1 <- function(dat1, dat2){
    tbl1 <- table(dat1$score)
    tbl2 <- table(dat2$score)
    inT <- intersect(names(tbl1), names(tbl2))
    dat1[dat1$score %in% c(setdiff(names(tbl1), inT),
                         inT[tbl1[inT]!=tbl2[inT]]),]

   }

 f1(df1, df2)
 #  id score
 #2  2    BB
 #3  3    BB

 f1(df2,df1)
 #  id score
 #2  2    BB
 #3  3    BB
 #4  4    BB
 #6  6    BC