2011-08-29 62 views
2
不需要的類型變化

說我生成,像這樣一些數據:分配到data.frame導致中的R

dat <- data.frame(x = rnorm(100), y = rnorm(100), z = rnorm(100)) 
dat[sample(nrow(dat), 5), 3] <- NaN 
dat[sample(nrow(dat), 5), 3] <- Inf 

現在,一些z值是InfNaN

cut(dat$z[is.finite(dat$z)],6)[1:10] 

結果的前10行是

[1] (0.286,1.17] (0.286,1.17] (0.286,1.17] (0.286,1.17] (0.286,1.17] 
[6] (0.286,1.17] (-1.48,-0.599] (-1.48,-0.599] (-0.599,0.286] (0.286,1.17] 
6 Levels: (-2.37,-1.48] (-1.48,-0.599] (-0.599,0.286] ... (2.06,2.94] 

但如果我嘗試做如下分配

dat$col[is.finite(dat$z)] <- cut(dat$z[is.finite(dat$z)],6) 

我得到的整數,而不是標籤:

> dat$col[1:10] 
[1] 4 4 4 4 4 4 2 2 NA 3 

如何正確地將因子標籤分配給行子集?

謝謝! 烏里

+0

這很正常。您有一個數字列,其中您可以使用切割結果更改某些值。因爲這是一個因素(本質上它是一個帶有標籤的數字),所以只需粘貼數字值而不是標籤。所以R沒有做一個不需要的類型改變。你期望R拒絕的類型改變,那就是你的問題。 ;) –

回答

0
dat[is.finite(dat$z),"col"] <- cut(dat$z[is.finite(dat$z)],6) 

應該工作。不過,我不知道爲什麼通過$分配不。

+0

'$ < - '函數與'[<-'函數不同,Extract頁面告訴我們'$ < - '沒有data.frame方法。 –

+0

@DWin但是在底部有一個'$ < - 。data.frame'方法。 '?Extract'頁面表示遞歸數據類型只有'$'方法(因此可能是'$ < - '方法),'data.frame'是一個遞歸類型的'list'。 –

+0

我發現你是對的,這種方法存在(儘管它與'[<。data.frame'函數不同,我正在閱讀這個句子:「請注意,$沒有data.frame方法,所以x $ name使用將x作爲列表的默認方法「並做出錯誤的結論。 –

0

我不能完全肯定,我的答案是你想要的,但如果你想標籤,而不是代表係數整數嘗試as.character

dat$col[is.finite(dat$z)] <- as.character(cut(dat$z[is.finite(dat$z)],6)) 

,如果你希望它是一個因素而不是一個特徵向量的,這個包裝成一個電話因素:

dat$col[is.finite(dat$z)] <- factor(as.character(cut(dat$z[is.finite(dat$z)],6)))