在R中替换值,将"Yes"替换为1,将"No"替换为0。

12

我正在使用R库中可用的weatherAUS数据集。 我试图将"RainTomorrow"列中的"Yes"替换为1,"No"替换为0。

我写了以下代码,但似乎不起作用:

weather4$RainTomorrow[weather4$RainTomorrow=="Yes"]<-1 

我刚刚说:

警告信息:在[<-.factor(*tmp*, weather4$RainTomorrow == "Yes", value = c(NA, : 无效的因子水平,生成 NA

这是什么意思?我该怎么办?我认为我应该在某个地方使用as.numeric或as.factor,但我不知道怎么做。


只需执行 as.integer(as.character(weather$RainTomorrow)=="Yes") - akrun
不,就保持原样。为什么您认为需要0/1而不是因子变量? - Roland
大家好。请看下面的帖子。我刚刚解决了这个问题。 - sockevalley
3个回答

16

您可以轻松使用dplyr实现此操作。

require(dplyr)
weather4 <- weather4 %>%
      mutate(RainToday = ifelse(RainToday == "No",0,1))

希望这能有所帮助


6
library(data.table)   
weather4[,":="(RainTomorrow=ifelse(RainTomorrow=="no",0,1))]

或者简单地使用:
as.numeric(as.factor(weather4$RainTomorrow))

不要在data.table中使用ifelse,这样效率很低。使用join或简单的子集替代它。然而,如果OP没有使用data.table,我不明白为什么需要它。 - Roland
1
@Roland 如何使用 as.numeric(as.factor(weather4$RainTomorrow)),我在我的端上测试过了,相比 ifelse 更加高效。 - BENY

4

当我们测试不同的模型时,这是一件相当常见的事情。例如,决策树可以很好地使用“是”和“否”。然而,某些回归模型需要使用1和0。特别是逻辑回归。

我通过使用plyr库来解决这个问题。这非常简单和方便。以下是我的解决方案。

解决方案来源:这里

library(plyr)
weather5$RainToday <- revalue(weather5$RainToday, c("Yes"=1))
weather5$RainToday <- revalue(weather5$RainToday, c("No"=0))
head(weather5$RainToday)
[1] 0 1 1 1 1 0
Levels: 0 1

和平!


1
然而,一些回归模型需要1和0。通常情况下,对于大多数基本的R统计过程,您不需要进行这样的转换 - 您的变量是因子,因此它将被正确处理。您可以自己尝试:glm(RainToday ~ ., data = weather5, family = binomial) - Gregory Demin
谢谢。我不知道那个。我认为我的变量之前不是因子,这迫使我将它们转换为1和0。 - sockevalley
不要认为我的变量是因子。 在 eval(expr, envir, enclos) 中出现错误:y 值必须在 0 <= y <= 1 范围内。 - sockevalley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接