【问题标题】:For NA in one column; cannot change factor levels of another column对于一列中的 NA;无法更改另一列的因子水平
【发布时间】:2016-12-02 11:06:24
【问题描述】:

这个问题似乎太简单了,甚至无法在这里提出;但我找不到有效的解决方案。我有一个 3 列的数据框 (df);其中一个是因子列 (df$Colors),具有 3 个级别(“蓝色”、“红色”和“黑色”)。在另一列 (df$Outliers) 中是数值,其中一些是“NA”。我想添加另一列(比如df$NewColors),类似于df$Colors,其中df$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)

【问题讨论】:

  • “NA”与 NA 不同。

标签: r


【解决方案1】:

这行得通:

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"

【讨论】:

  • 工作就像一个魅力......让我觉得自己像个傻瓜!谢谢@JonGrub
  • 你不需要。提问是我学到这一点的方式:)顺便说一句:如果你喜欢我的回答,你会接受吗?
【解决方案2】:

@joel.wilson 提到您的数据示例不正确,因为它给出了字符“NA”而不是缺失值 (NA)。如果这是导致问题的原因,您可以使用以下方法进行调整:

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

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

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

如果 df$Outliers 为 NA,则返回“橙色”,否则返回 df$Colors。 使用as.factor 使这个新变量再次成为一个因素。

【讨论】:

    【解决方案3】:

    如评论中所述,NA 不是"NA"。如果您有"NA",您的异常值将被视为字符数据,因为数值被强制转换。此外,is.na("NA") 返回 FALSE。如果您的NA 得到适当处理,您的代码应该没问题。您也可以考虑使用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"

    【讨论】:

      猜你喜欢
      • 2014-11-12
      • 2021-03-13
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      相关资源
      最近更新 更多