如何比较不同水平的两个因素?
How can I compare two factors with different levels?
是否可以比较长度相同但水平不同的两个因子?例如,如果我们有这 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)
我收到以下错误:
Error in Ops.factor(A, B) : level sets of factors are different
转换为字符然后比较:
# 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)
Error in Ops.factor(A, B) : level sets of factors are different
mean(as.character(A) == as.character(B))
# [1] 0.6
或者另一种方法是
mean(levels(A)[A] == levels(B)[B])
在 1e8 数据集上慢了 2 倍。
如 @zx8754 的回答那样转换为 character
是解决此问题的最简单方法,并且可能是您几乎总是想使用的方法。不过,另一种选择是更正这 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
是否可以比较长度相同但水平不同的两个因子?例如,如果我们有这 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)
我收到以下错误:
Error in Ops.factor(A, B) : level sets of factors are different
转换为字符然后比较:
# 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)
Error in Ops.factor(A, B) : level sets of factors are different
mean(as.character(A) == as.character(B))
# [1] 0.6
或者另一种方法是
mean(levels(A)[A] == levels(B)[B])
在 1e8 数据集上慢了 2 倍。
如 @zx8754 的回答那样转换为 character
是解决此问题的最简单方法,并且可能是您几乎总是想使用的方法。不过,另一种选择是更正这 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