【问题标题】:How can I compare two factors with different levels?如何比较具有不同水平的两个因素?
【发布时间】:2016-06-22 08:05:07
【问题描述】:

是否可以比较两个长度相同但水平不同的因素?例如,如果我们有这 2 个因子变量:

A <- factor(1:5)

str(A)
 Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5

B <- factor(c(1:3,6,6))

str(B)
 Factor w/ 4 levels "1","2","3","6": 1 2 3 4 4

如果我尝试使用例如== 运算符来比较它们:

mean(A == B)

我收到以下错误:

Ops.factor(A, B) 中的错误:因子的水平集不同

【问题讨论】:

  • 请您解释一下比较两个因素是什么意思。我不清楚。
  • @user2100721 我假设他们想知道重叠的比例。在我的帖子中的示例中,重叠是353/5 = 0.6 中。请注意,TRUE/FALSE 隐式转换为 1/0,即:TRUE + TRUE = 2
  • @zx8754 谢谢。明白你的意思。
  • @zx8754 抱歉打扰了,我之前忘记用factor 包装了。使用 microbenchmark,您的解决方案速度几乎快了 2 倍,这有点令人惊讶。
  • @zx8754 我根本不关心代表 :-)

标签: r r-factor


【解决方案1】:

转换为字符然后比较:

# data
A <- factor(1:5)
B <- factor(c(1:3,6,6))

str(A)
# Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5
str(B)
# Factor w/ 4 levels "1","2","3","6": 1 2 3 4 4

mean(A == B)

Ops.factor(A, B) 中的错误:因子的水平集不同

mean(as.character(A) == as.character(B))
# [1] 0.6

或者另一种方法是

mean(levels(A)[A] == levels(B)[B])

在 1e8 数据集上慢 2 倍。

【讨论】:

  • 您也可以查看all.equal,具体取决于您所说的“比较”是什么意思。
  • @David_B 我不确定在这种情况下如何使用all.equal
【解决方案2】:

转换为character 如@zx8754 的回答是解决此问题的最简单方法,并且可能是您几乎总是想使用的方法。但是,另一种选择是更正这 2 个变量,使它们具有相同的水平。如果您出于某种原因想要将这些变量保留为 factor 并且不想通过重复调用 as.character 来阻塞您的代码,您可能想要这样做。

A <- factor(1:5)
B <- factor(c(1:3,6,6))

mean(A == B)
Error in Ops.factor(A, B) : level sets of factors are different

我们可以取两个因子水平的union 得到任一因子的所有水平,然后使用该联合作为水平重新设置因子。现在,即使 2 个因子的值不同,但它们之间的水平是相同的,您可以比较它们:

C = factor(A, levels = union(levels(A), levels(B)))
D = factor(B, levels = union(levels(A), levels(B)))

mean(C==D)
[1] 0.6

如您所见,值没有变化,但级别现在相同。

C
[1] 1 2 3 4 5
Levels: 1 2 3 4 5 6

D
[1] 1 2 3 6 6
Levels: 1 2 3 4 5 6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 2015-07-23
    • 2020-05-03
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多