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
,预计会有另一个结果答案 0 :(得分:1)
在这里,我们可以使用frequency
检查每个数据集的score
table
。然后,使用names
在tables
中查找两个数据集共有的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