【问题标题】:Getting a error when using If / Else if on string in R在 R 中的字符串上使用 If / Else if 时出错
【发布时间】: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)
  • 我不会使用循环进行转换。如果值为JanFebMarmatch(forestfires$month, month.abb) 就足够了
  • 这是因为month.abbJanFeb 等,而您拥有的值为janfeb、。在下面的解决方案中将month.abb转换为小写,它应该可以工作

标签: r dataframe if-statement


【解决方案1】:

一个更简单的选择是

forestfires$month <- as.character(match(forestfires$month, tolower(month.abb)))

【讨论】:

  • 是的。就一行。惊人的。非常感谢!
猜你喜欢
  • 2014-05-20
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2018-03-09
相关资源
最近更新 更多