2017-08-10 59 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