2011-11-22 88 views
11

这让我感到很蠢,但我试图产生一个连接两个因素的vector/df/list/etc(除了矩阵之外的任何东西)。这是场景。我有一个100k线数据集。我用上半部分来预测下半部分,反之亦然,用knn。所以现在我有两个由knn predict()创建的对象。R连接两个因素

> head(pred11) 
[1] 0 0 0 0 0 0 
Levels: 0 1 
> head(pred12) 
[1] 0 1 1 0 0 0 
Levels: 0 1 
> class(pred11) 
[1] "factor" 
> class(pred12) 
[1] "factor" 

这里是我的问题开始的地方:

> pred13 <- rbind(pred11, pred12) 
> class(pred13) 
[1] "matrix" 

有2个问题。首先,它将0和1的值更改为1和2,然后它会创建一个巨大的矩阵,它会消耗我所有的记忆。我试过用as.numeric(),data.frame()等搞乱,但不能把它仅仅结合2个50k因子到1个100k之中。有什么建议么?

+0

标题和描述让我感到困惑 - 好像你需要[*交互*](https://stat.ethz.ch/pipermail/r-help/2008-November/178808.html)(参见?互动)的因素,但实际上你需要*连接*。 “组合”是相当含糊的术语。我会尝试编辑您的问题以清楚地说明问题。 – TMS

回答

18

rbind将在您的情况下创建2 x 50000矩阵,这不是您想要的。 c是将2个向量组合在一个更长的向量中的正确函数。当您对因子使用rbindc时,它将使用映射到级别的基础整数。一般来说,你需要为一个字符重构之前结合:

x1 <- factor(sample(0:1,10,replace=T)) 
x2 <- factor(sample(0:1,10,replace=T)) 

factor(c(as.character(x1),as.character(x2))) 
[1] 1 1 1 0 1 1 0 1 0 0 0 1 1 1 1 1 1 0 0 0 
Levels: 0 1 
+0

这样做。非常感谢你! – screechOwl

26

@詹姆斯提出的一种方式,我会与另一个(短)凑钱:

set.seed(42) 
x1 <- factor(sample(0:1,10,replace=T)) 
x2 <- factor(sample(0:1,10,replace=T)) 

unlist(list(x1,x2)) 
# [1] 1 1 0 1 1 1 1 0 1 1 0 1 1 0 0 1 1 0 0 1 
#Levels: 0 1 

...这似乎是一个有点像魔术,但unlist对这个特殊目的的因素有特殊的支持!列表中的所有元素都必须是这个工作的因素。

+0

哇。一点点。你从哪里学到的? –

+1

@DWin - 好吧,它探索了R和S +之间的区别... – Tommy

+0

对于Tommy的答案+1000,它允许避免使用'as.character',并且在处理因素时,这是__VERY__愉快 –