我有一个数据集:
> 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 different
或invalid factor level, NA generated
。
我该怎么做?
答案 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'