【问题标题】:No applicable method for 'anti_join' applied to an object of class "factor"没有适用于“因素”类对象的“anti_join”方法
【发布时间】:2015-08-18 18:05:40
【问题描述】:

我想根据特定列识别 dataframe1 中存在的行,而 dataframe2 中不存在这些行。我已经使用下面的代码来获取所需的信息。

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

不幸的是,我遇到了一个错误:

UseMethod("anti_join") 错误:
没有适用于“因素”类对象的“anti_join”方法

我已经检查了两个数据框中所需列的类,结果是factor。还尝试将列分成一个单独的变量,假设它可以解决问题,但没有运气!

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

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

谢谢

【问题讨论】:

  • 正确的标签是 data.frame 而不是 dataframes,仅供参考。 (我已经编辑过了。)

标签: r dataframe comparison dplyr anti-join


【解决方案1】:

几乎所有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 之间的转换。

如果你想对向量进行操作,那么你可以使用setdiffbasedplyr 都可用)

> setdiff(dat$ID, datwe$ID)
[1] 1 6 4

【讨论】:

  • 谢谢@zero323。它适用于上述建议。 (我将保持这个线程开放一段时间,以学习执行此任务的其他方法并将此标记为答案)您能否解释一下为什么只有一列时它不起作用?
  • 如果只有一列,它就可以完美运行。问题是 dat$ID 不再是 data.frame 而是一个向量。
  • 哦,anti_join 只能用于data.frame。谢谢!
  • 精确到可以强制转换为dplyr::tbl的对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2022-09-24
相关资源
最近更新 更多