2017-08-10 86 views
0

我想將測試$收入削減爲25個等級,並使用派生的區間,我將它們存儲在一個稱爲等級的變量中,並且希望根據相同的等級削減火車$收入間隔。我嘗試了下面的代碼,但我不確定爲什麼我的一些列車$收入值被強制爲NA。根據r中另一列的間隔切出一列

出了什麼問題?有一個更好的方法嗎?謝謝!

test$income <- cut(test$income,b=25) 

levels <- c(-0.853,-0.586,-0.325,-0.0643,0.196,0.457,0.718,0.978,1.24,1.5,1.76,2.02,2.28,2.54,2.8,3.06,3.32,3.59,3.85,4.11,4.37,4.63,4.89,5.15,5.41,5.68) 

train$income <- cut(train$income,levels) 
+0

如果您的火車$收入高於5.68,則可以引入新輔助功能...... –

回答

0

由於@JohnGilfillan說,一個原因可能是你的train$income比5.68高於或低於-0.853更低。在這種情況下,您將獲得一些您的價值作爲NA,而其他人將是數字。這是一種可能的情況,但另一個原因(對於另一個實例)可能是因爲您使用了字符向量來指定實際代碼中的中斷(levels,從cut對象將返回一個字符向量)。在這種情況下,你將得到一個只有NAs的矢量(寫作<NA>)。

解決的辦法是擴大levels載體的極值。

試試這個:

set.seed(1) 
a <- runif(100, -6, 6) 

set.seed(2) 
b <- runif(100, -6, 6) 

levs <- levels(cut(a, 25)) 
levs <- gsub("\\(", "", levs) 
levs <- gsub("\\]", "", levs) 
levs <- c(as.numeric(sapply(strsplit(levs, ","), "[", 1)), 
as.numeric(sapply(strsplit(levs, ","), "[", 2))[length(levs)]) 

cut.b <- cut(b, levs) 

## Both NA values are outside levs 
b[is.na(cut.b)] 

cut.b.new <- cut(b, c(-6, levs[c(-1, -length(levs))], 6)) 

## No NAs 
any(is.na(cut.b.new)) 

PS:不建議使用功能名稱作爲對象名稱。因此levs而不是levels