【发布时间】:2019-11-16 21:54:55
【问题描述】:
我正在尝试将几个月的字符串字符转换为数字表示。正如您从代码中看到的那样,我试图将数字转换为字符,这样我就不会将数字放在字符串曾经所在的位置。但我仍然收到以下错误。我正在使用 na.omit 所以数据集中应该没有 NA。
Warning message:
In `[<-.factor`(`*tmp*`, i, value = c(8L, 11L, 11L, 8L, 8L, 2L, :
invalid factor level, NA generated
代码如下:
forestfires <- read.csv('forestfires.csv')
forestfireDf <- data.frame(cbind(forestfires))
forestfireDf <- na.omit(forestfireDf)
for (i in length(forestfireDf)) {
if (forestfireDf$month[i] == 'jan') {
forestfireDf$month[i] = as.character(1)
} else if (forestfireDf$month[i] == 'feb') {
forestfireDf$month[i] = as.character(2)
} else if (forestfireDf$month[i] == 'mar') {
forestfireDf$month[i] = as.character(3)
} else if (forestfireDf$month[i] == 'apr') {
forestfireDf$month[i] = as.character(4)
} else if (forestfireDf$month[i] == 'may') {
forestfireDf$month[i] = as.character(5)
} else if (forestfireDf$month[i] == 'jun') {
forestfireDf$month[i] = as.character(6)
} else if (forestfireDf$month[i] == 'jul') {
forestfireDf$month[i] = as.character(7)
} else if (forestfireDf$month[i] == 'aug') {
forestfireDf$month[i] = as.character(8)
} else if (forestfireDf$month[i] == 'sep') {
forestfireDf$month[i] = as.character(9)
} else if (forestfireDf$month[i] == 'oct') {
forestfireDf$month[i] = as.character(10)
} else if (forestfireDf$month[i] == 'nov') {
forestfireDf$month[i] = as.character(11)
} else if (forestfireDf$month[i] == 'dec') {
forestfireDf$month[i] = as.character(12)}
}
【问题讨论】:
-
我认为您不需要
data.frame(cbind,因为read.csv已经是一个data.frame。您可以在 read.csv 中添加stringsAsFactors = FALSE以将字符串作为字符类读取,而不是factor。另外,要转换为索引,您可以使用mach(forestfires$month, month.abb) -
作为一般提示,您应该真正使用日期库而不是像这样复制粘贴代码。
-
@Thomas_ 不清楚你是怎么读的
read.csv('forestfires.csv', stringsAsFactors = FALSE) -
我不会使用循环进行转换。如果值为
Jan、Feb、Mar,match(forestfires$month, month.abb)就足够了 -
这是因为
month.abb是Jan、Feb等,而您拥有的值为jan、feb、。在下面的解决方案中将month.abb转换为小写,它应该可以工作
标签: r dataframe if-statement