如何覆盖R中的因子

时间:2014-08-21 21:45:30

标签: r

我有一个数据集:

> k
       EVTYPE FATALITIES INJURIES
198704   HEAT        583        0
862634   WIND        158     1150
68670    WIND        116      785
148852   WIND        114      597
355128   HEAT         99        0
67884    WIND         90     1228
46309    WIND         75      270
371112   HEAT         74      135
230927   HEAT         67        0
78567    WIND         57      504

变量如下。根据joran的第一个答案,未使用的级别可以被droplevels删除,所以不用担心898级别,我显示的说明k完整k <- d1[1:10, 3:4]获取的数据集,其中d1是原始数据集。

> str(k)
'data.frame':   10 obs. of  3 variables:
 $ EVTYPE    : Factor w/ 898 levels "   HIGH SURF ADVISORY",..: 243 NA NA NA 243 NA NA 243 243 NA
 $ FATALITIES: num  583 158 116 114 99 90 75 74 67 57
 $ INJURIES  : num  0 1150 785 597 0 ...

我试图覆盖WIND因素:

> k[k$EVTYPE==factor("WIND"), ]$EVTYPE <- factor("AFDAF")
> k[k$EVTYPE=="WIND", ]$EVTYPE <- factor("AFDAF")

但这两个命令都会向我显示错误消息:level sets of factors are differentinvalid factor level, NA generated

我该怎么做?

1 个答案:

答案 0 :(得分:1)

请改为尝试:

k <- droplevels(d1[1:10, 3:5])

因素(根据文档)只是整数代码的向量,然后是每个代码的简单标签向量。这些被称为&#34;等级&#34;。级别是一个属性,即使在子集化时也会保留您的数据。

这是一个功能,因为对于许多统计程序而言,跟踪变量可能具有的所有可能的值是至关重要的,即使它们不具备这些值。 t出现在实际数据中。

有些人发现这种烦恼并使用options(stringsAsFactors = FALSE)运行R.

要简单地更改级别,您可以执行以下操作:

d <- read.table(text = "      EVTYPE FATALITIES INJURIES
 198704   HEAT        583        0
 862634   WIND        158     1150
 68670    WIND        116      785
 148852   WIND        114      597
 355128   HEAT         99        0
 67884    WIND         90     1228
 46309    WIND         75      270
 371112   HEAT         74      135
 230927   HEAT         67        0
 78567    WIND         57      504",header = TRUE,sep = "",stringsAsFactors = TRUE)
> str(d)
'data.frame':   10 obs. of  3 variables:
 $ EVTYPE    : Factor w/ 2 levels "HEAT","WIND": 1 2 2 2 1 2 2 1 1 2
 $ FATALITIES: int  583 158 116 114 99 90 75 74 67 57
 $ INJURIES  : int  0 1150 785 597 0 1228 270 135 0 504
> levels(d$EVTYPE) <- c('A','B')
> str(d)
'data.frame':   10 obs. of  3 variables:
 $ EVTYPE    : Factor w/ 2 levels "A","B": 1 2 2 2 1 2 2 1 1 2
 $ FATALITIES: int  583 158 116 114 99 90 75 74 67 57
 $ INJURIES  : int  0 1150 785 597 0 1228 270 135 0 504

或者只改变一个:

levels(d$EVTYPE)[2] <- 'C'