如何比较不同级别的两个因素?

时间:2016-06-22 08:05:07

标签: r r-factor

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

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)中的错误:因素的级别集是不同的

2 个答案:

答案 0 :(得分:8)

转换为字符然后比较:

# 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倍。

答案 1 :(得分:0)

按照@ zx8754的答案转换为character是解决此问题的最简单方法,而且可能是您几乎总是希望使用的方法。但是,另一个选择是更正这两个变量,以使它们具有相同的级别。如果出于某种原因要将这些变量保留为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