对于一列中的NA;无法更改其他列的因子级别

时间:2016-12-02 11:06:24

标签: r

问题似乎太简单了,甚至不能放在这里;但我找不到有效的解决方案。我有一个3列的数据框(df);其中一个是具有3个级别(“蓝色”,“红色”和“黑色”)的因子列(df$Colors)。在另一列(df$Outliers)中是数值,其中一些是“NA”。我想添加另一列(比如df$NewColors),类似于df$Colorsdf$Outliersdf$NewColors = "Orange"中的“NA”。 我添加了一个额外的级别如下:

 > levels(df$Colors) <- c(levels(df$Colors), "Orange")

然而,新添加的列似乎是使用旧的“颜色”值,而不是将其替换为“橙色”,它应该在那里。它还为df$Colors的因子生成整数值,但我想保留旧的分类变量。 我使用的代码如下:

>levels(df$Color) <- c(levels(df$Color),"Orange")

> for (i in 1:nrow(df)) {
    df$NewColors[i] <- ifelse (is.na(df$Outliers[i]), "Orange", df$Colors[i]) 
  }

我哪里错了?
以下是示例数据:

> BodyLength <- rep(seq(1,9),2)
> Colors <- rep(c("Black","Blue","Red"),6)
> Outliers <- c(seq(1,8),"NA",seq(1,8),"NA")
> df <- data.frame(BodyLength,Colors,Outliers)

3 个答案:

答案 0 :(得分:0)

正如@ joel.wilson所提到的,你的数据示例是不正确的,因为它给出了角色&#34; NA&#34;而不是缺失值(NA)。如果导致问题,您可以使用以下方法进行调整:

df$Outliers[which(df$Outliers=="NA")]<-NA

除此之外,这样的事情应该适用于你想要实现的目标:

df$new.colors<-ifelse(is.na(df$Outliers),"Orange",as.character(df$Colors))

返回&#34; Orange&#34;如果df $ Outliers是NA,否则返回df $ Colors。 使用as.factor再次将此新变量设为一个因子。

答案 1 :(得分:0)

这有效:

df$Colors_new <- df$Colors
levels(df$Colors_new) <- c(levels(df$Colors_new),"Orange")
df$Colors_new[which(df$Outliers == "NA")] <- "Orange"

请注意,您的NA不是真正的NA,而是表示NA的文本。要做到这一点,样本数据必须是:

Outliers <- c(seq(1,8),NA,seq(1,8),NA)

然后你可以使用:

df$Colors_new[is.na(df$Outliers)] <- "Orange"

答案 2 :(得分:0)

正如评论NA中所述,"NA"不是"NA"。如果您有is.na("NA"),则将您的异常值视为字符数据,因为数值是强制的。另外NA返回FALSE。如果您的replace得到了适当的对待,那么您的代码就可以了。您还可以考虑使用BodyLength <- rep(seq(1,9),2) Colors <- rep(c("Black","Blue","Red"),6) Outliers <- c(seq(1,8),NA,seq(1,8),NA) df <- data.frame(BodyLength,Colors,Outliers) df$newColors = df$Colors levels(df$newColors) = c(levels(df$Colors),"Orange") df$newColors = replace(df$newColors,is.na(df$Outliers),"Orange") 作为循环的替代方法。

"NA"

如果您打算将异常值设为字符is.na,则df$Outliers == "NA"应替换为Miqi180