在R中,如何测试两个因子是否相等?

4

我正在生成一个具有不同级别的因素列表,并且我希望能够检测出其中两个定义了相同的分区。例如,我想将以下所有内容视为等效:

x1 <- factor(c("a", "a", "b", "b", "c", "c", "a", "a"))
x2 <- factor(c("c", "c", "b", "b", "a", "a", "c", "c"))
x3 <- factor(c("x", "x", "y", "y", "z", "z", "x", "x"))
x4 <- factor(c("a", "a", "b", "b", "c", "c", "a", "a"), levels=c("b", "c", "a"))

什么是最好的方法来完成这件事?
1个回答

5

我猜你想要确定双向表格具有与单向分类相同数量的填充级别。在 interaction 中的默认设置是表示所有级别,即使未填充,但将 drop=TRUE 设置为适应您的目的:

> levels (interaction(x1,x2, drop=TRUE) )
[1] "c.a" "b.b" "a.c"
> length(levels(x1) ) == length(levels(interaction(x1,x2,drop=TRUE) ) )
[1] TRUE

这个概括会考虑到所有(<3个必要的逻辑比较>):

 all( length(levels(x1) ) == length(levels(interaction(x1,x2,drop=TRUE) ) ),
      length(levels(x1) ) == length(levels(interaction(x1,x3,drop=TRUE) ) ),
      length(levels(x1) ) == length(levels(interaction(x1,x4,drop=TRUE) ) ) )
#[1] TRUE

1
我发现使用 table(x1, x2) 可以很好地可视化这种方法。你可以看到每一列(和行)只有一个非零条目。 - bdemarest
1
要以程序化方式使用table(x1,x2)函数,您需要类似于sum(table(x1,x2) != 0 )这样的内容。 - IRTFM
对于大向量,interaction 可能会变得缓慢,可以通过使用 paste 来加速。 - Empiromancer
我总是愿意学习新的东西,但是通过观看精心构建的演示更容易理解。 - IRTFM

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