2014-06-11 54 views
0

這是數據集的link。我正在分類我的數據。 DR_AGE工作得很好。將數值數據更改爲分類數據

setwd("~/data1") 
a2 <- read.csv("data1.csv") 
dim(a2) 
[1] 11503  7 
names(a2) 
[1] "CR_HOUR" "adt"  "ln"  "pav"  "DR_AGE" "NUM_OCC" "VEH_YEAR" 

## categorize DR_AGE 

a2$DR_AGE[a2$DR_AGE < 25] <- "15-24" 
a2$DR_AGE[a2$DR_AGE>24 & a2$DR_AGE < 35] <- "25-34" 
a2$DR_AGE[a2$DR_AGE >34 & a2$DR_AGE < 45] <- "35-44" 
a2$DR_AGE[a2$DR_AGE >44 & a2$DR_AGE < 55] <- "45-54" 
a2$DR_AGE[a2$DR_AGE >54 & a2$DR_AGE < 65] <- "55-64" 
a2$DR_AGE[a2$DR_AGE >64 & a2$DR_AGE < 75] <- "65-74" 
a2$DR_AGE[a2$DR_AGE >74 ] <- "75 plus" 
a2$DR_AGE <- factor(a2$DR_AGE) 
table(a2[, "DR_AGE"])     ## All categories are generated. 
    15-24 25-34 35-44 45-54 55-64 65-74 75 plus 
    2298 2118 1638 1526 1036  511  350 

但是有東西時,我試圖分類CR_HOUR或VEH_YEAR錯誤。

## categorize CR_HOUR 
a2$CR_HOUR[a2$CR_HOUR < 7] <- "00-06" 
a2$CR_HOUR[a2$CR_HOUR>6 & a2$CR_HOUR < 13] <- "07-12" 
a2$CR_HOUR[a2$CR_HOUR >12 & a2$CR_HOUR < 19] <- "13-18" 
a2$CR_HOUR[a2$CR_HOUR >18 ] <- "19-24" 
a2$CR_HOUR <- factor(a2$CR_HOUR) 
table(a2[, "CR_HOUR"])    ### "07-12" is not generated. ???? 

00-06 10 11 12 13-18 19-24 
1234 303 338 378 4152 5096 

## categorize VEH_YEAR 
a2$VEH_YEAR[a2$VEH_YEAR >1930 & a2$VEH_YEAR <1991] <- "1990 and Before" 
a2$VEH_YEAR[a2$VEH_YEAR>1990 & a2$VEH_YEAR < 2001] <- "1991-2000" 
a2$VEH_YEAR[a2$VEH_YEAR>2000 & a2$VEH_YEAR < 2011] <- "2001-2010" 
a2$VEH_YEAR[a2$VEH_YEAR >2010] <- "2011 and After" 
a2$VEH_YEAR<- factor(a2$VEH_YEAR) 
table(a2[, "VEH_YEAR"])    ### "!990 and Before" is not generated. ???? 

    1991-2000  2001-2010 2011 and After 
      4842   4763    57 

我正在努力解決這個問題。任何幫助表示讚賞。

回答

1

的問題是,當你做

a2$CR_HOUR[a2$CR_HOUR < 7] <- "00-06" 

你分配一個字符值的數字列。這導致數據類型CR_HOUR更改爲字符和混亂與蒸汽比較。這不是重新編碼數據的有效方法。最好爲分類名稱創建一個新的字符向量,然後將其添加到data.frame中,或者在所有替換完成後替換當前列。

如果你有這樣的範圍,cut()命令可能非常有用。例如

agebr<-c(14,24,34,44,54,64,74,Inf) 
a2$DR_AGE <-cut(a2$DR_AGE, breaks=agebr, 
    labels=paste(head(agebr,-1)+1, tail(agebr,-1), sep="-")) 
table(a2$DR_AGE) 

hourbr<-c(0,6,12,18,24) 
a2$CR_HOUR <- cut(a2$CR_HOUR, breaks=hourbr, 
    labels=paste(sprintf("%02d", ifelse(head(hourbr,-1)>0,head(hourbr,-1)+1,0)), 
    sprintf("%02d",tail(hourbr,-1)), sep="-"), include.lowest=T) 
table(a2$CR_HOUR) 

a2$VEH_YEAR <- cut(a2$VEH_YEAR, breaks=c(0,1990,2000,2010,Inf), 
    labels=c("1990 and Before","1991-2000","2001-2010","2011 and After")) 
table(a2$VEH_YEAR) 

這有點麻煩,因爲我試圖製作相同的標籤,但功能本身非常易於使用。

+0

它解決了我的部分問題。在我的代碼中,我能夠重新編碼主數據集。在這裏,我不能使用此代碼來改變我的數據集與記錄輸入。 –

+0

我已經編輯過,使其更清楚如何重新分配到原始data.frame。 – MrFlick

+0

現在它工作得很好。 –