簡體   English   中英

根據r中另一列的間隔剪切一列

[英]Cut a column based on intervals of another column in r

我想將test $ income分成25個級別,並使用導出的間隔,將它們存儲在一個名為level的變量中,我希望基於相同的間隔來削減train $ income。 我在下面嘗試了以下代碼,但是我不確定為什么train $ income中的某些值被強制為NA。

什么地方出了錯? 有一個更好的方法嗎? 謝謝!

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)

正如@JohnGilfillan所說,原因之一可能是您的train$income高於5.68或低於-0.853。 在這種情況下,您將獲得一些值為NA的值,而其他值為數字。 這是一種可能的情況,但是另一個原因(針對另一個實例)可能是您使用了字符向量來指定實際代碼中的中斷( cut對象的levels將返回字符向量)。 在這種情況下,您將獲得僅具有NA的向量(寫為<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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM