combn unclasses factor variables

6

更新:已修复

这个问题在即将发布的R3.1.0版本中已经得到了修复。从CHANGELOG可以看到:

对于因子变量输入xcombn(x, simplify = TRUE)现在会给出一个因子结果(之前是用户错误)。
相关链接:PR#15442


我注意到了一个有趣的事情。为什么combn似乎会将除第一个之外的所有factor变量取消分类为它们底层的数字值?

x <- as.factor( letters[1:3] )

combn( x , 2 )
#     [,1] [,2] [,3]
#[1,] "a"  "1"  "2" 
#[2,] "b"  "3"  "3" 

x是字符时,这种情况不会发生:

x <- as.character( letters[1:3] )

combn( x , 2 )
#     [,1] [,2] [,3]
#[1,] "a"  "a"  "b" 
#[2,] "b"  "c"  "c"

在OS X 10.7.5和Windows 7上,R64存在可重现性问题。


5
在 R 语言中,因子是一个很大的难点。在不同的函数中对它们的处理方式千差万别,而正确处理它们则相当困难。 - Konrad Rudolph
3个回答

2

我认为这是由于 simplify 参数进行的 matrix 转换所致。如果您不使用它,您会得到:

combn( x , 2 , simplify=FALSE)
[[1]]
[1] a b
Levels: a b c

[[2]]
[1] a c
Levels: a b c

[[3]]
[1] b c
Levels: a b c

由于combn的工作方式,第一列数据是正确的。首先指定第一列,然后使用[<-更改其他列数据,如下所示:
m <- matrix(x,3,3)
m[,2] <- sample(x)
m
     [,1] [,2] [,3]
[1,] "a"  "1"  "a" 
[2,] "b"  "3"  "b" 
[3,] "c"  "2"  "c" 

我认为有问题的函数是 [<-

谢谢James,我会在源代码中挖掘[<-以查看是否能够弄清楚发生了什么(虽然我不太擅长阅读源代码 - 它很费劲)。 - Simon O'Hanlon
@SimonO101 祝你好运,这是一个原始函数,引用手册关于内部函数的话:“只有真正的 R 巫师才应该考虑使用此函数”。 - James
е“ҲпјҢжҲ‘д»ҘдёәйӮЈжҳҜз”ЁжқҘжҗһ.Internalзҡ„пјҒжҲ‘дҝқиҜҒеҸӘдјҡйҳ…иҜ»пјҢдёҚдјҡе°қиҜ•ж–Ҫжі•пјҒ - Simon O'Hanlon

1
作为Konrad所说,因素的处理常常很奇怪,或者至少不一致。在这种情况下,我认为行为足够奇怪,可以构成一个错误。尝试提交它,看看响应是什么。
由于结果是矩阵,并且没有因子矩阵类型,我认为正确的行为应该在函数开始处将因子输入转换为字符。

另一个常见的奇怪行为是使用因子进行索引。假设有 x <- factor(letters[1:3])y <- c(c = 9, b = 6, a = 3),那么 y[x] 的值是多少?它与 y[as.character(x)]y[as.integer(x)] 相同吗? - Richie Cotton
我会尝试提交一个错误报告,但是这个想法让我感到害怕!谢谢。 - Simon O'Hanlon
@SimonO101 -- 听起来你基本上想在combn()中增加一行代码,即在读取out <- matrix(r, nrow = len.r, ncol = count)之前的某个地方添加if(is.factor(r)) r <- as.character(r) - Josh O'Brien
@JoshO'Brien,无论如何我还是提交了错误报告15442。我会看看会发生什么。 - Simon O'Hanlon
@SimonO101 -- 恭喜你 成功报告了这个 bug。干得好。 - Josh O'Brien

0

我也遇到了同样的问题。在combn命令内部强制转换为字符向量似乎可以解决问题:

 > combn(as.character(x),2)

     [,1] [,2] [,3]
[1,] "a"  "a"  "b" 
[2,] "b"  "c"  "c" 

或者将R更新到V 3.1(预发布版)。这个问题已经在即将发布的版本中得以解决。从变更日志来看: combn(x, simplify = TRUE)现在对于因子输入x会给出因子结果(之前是用户错误)。与PR#15442相关。 - Simon O'Hanlon

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