2011-11-22 62 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__愉快 –