没有适用于“anti_join”的方法可以应用于“factor”类的对象。

8
我想要根据特定列,在dataframe1中确定不在dataframe2中的行。我已使用以下代码获取所需信息。
diffId <- anti_join(dat$ID,datwe$ID)

很遗憾,我遇到了一个错误:

Error in UseMethod("anti_join") :
no applicable method for 'anti_join' applied to an object of class "factor"

我检查了数据框中所需列的类,并发现它是factor。我尝试将该列分离成一个单独的变量,以解决这个问题,但是没有成功!

fac1 <- datwe$ID
fac2 <- dat$ID
diffId <- anti_join(fac2,fac1)

你能分享一下你的想法吗?

谢谢。


正确的标签是 data.frame 而不是 dataframes,供您参考。 (我已经编辑过了。) - Frank
1个回答

5

几乎所有的dplyr函数都是在tbls(根据上下文可以是data.framedata.table、数据库连接等)上操作的,所以你真正想要的是这样的:

> dat <- data.frame(ID=c(1, 3, 6, 4), x=runif(4))
> datwe <- data.frame(ID=c(3, 5, 8), y=runif(3))
> anti_join(dat, datwe, by='ID') %>% select(ID)
  ID
1  4
2  6
3  1

请注意,排序明显不被保留。
如果您使用不同级别的因子(与上面的示例中的数字不同),则涉及factorcharacter之间的转换。
如果要对向量进行操作,则可以使用setdiff(在basedplyr中都可用)。
> setdiff(dat$ID, datwe$ID)
[1] 1 6 4

谢谢@zero323。使用上面的建议解决了问题。(我将保持此线程一段时间以学习其他执行此任务的方法,并将此问题标记为答案)能否请您解释一下为什么只有一个列时它不起作用? - Prradep
如果只有一列,它可以完美地工作。问题是dat$ID不再是一个data.frame而是一个向量。 - zero323
哦,anti_join 只能用于 data.frame。谢谢! - Prradep
准确地说,可以强制转换为 dplyr::tbl 的对象。 - zero323

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接