2014-06-11 51 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

现在它工作得很好。 –