首页 > 解决方案 > 变量值随“ifelse”变化

问题描述

我想将变量“月”更改为新变量“季节”。我尝试了以下两种方法,但似乎我的代码中有一些错误。

train_fd<-train_fd %>% mutate(season = ifelse(month <= 2 & month == 12,"winter",
                                         ifelse(month <= 5 & month > 3,"spring",
                                                ifelse(month <= 9 & month > 6,"summer","fall"))))

train_fd <- within(train_fd,
                  {
                    season = character(0)
                    season[month <= 2 & month == 12] = "winter"
                    season[month <= 5 & month >= 3] = "spring"
                    season[month <= 9 & month >= 6] = "summer"
                    season[month == 10 & month == 11] = "fall"
                    season = factor(season, level = c("winter","spring","summer","fall"))
                  })

我希望 level 的输出是c("winter","spring","summer","fall"),但实际输出是 level

c("winter", "fall")

标签: r

解决方案


坦率地说,我会为自己省去很多麻烦做一个明确的字典:

m2s <- c( rep("winter", 2), 
          rep("spring", 3), 
          rep("summer", 4), 
          rep("fall", 2), "winter)

现在你可以简单地

train_fd$season <- m2s[ train_fd$month ]

请注意第一种方法中的问题:

  • month <= 2 & month == 12总是返回FALSE,因为你使用&而不是|; 因此一月、二月和十二月都变成了“秋天”;
  • month <= 5 & month > 3如果month == 3?然后三月是秋天...
  • month <= 9 & month > 6再一次,六月变成了秋天。

您的第二种方法复制了其中一些错误(例如&冬季)并添加新错误(例如 condition month == 10 & month == 11,它总是返回FALSE)。但是,我一点也不知道如何winter在任何方法中获得输出级别:这是不可能的。

底线是:多层条件句容易出现拼写错误。


推荐阅读