【问题标题】:Covert NAs to a separate level in each variable using mutate()使用 mutate() 将 NA 转换为每个变量中的单独级别
【发布时间】:2020-06-15 00:17:02
【问题描述】:

我有 12 个变量也包含 NA 值。我需要将 NA 转换为单独的级别。某些变量的水平值不同。以下是代码:

Replace_NAs <- function(colindex, na_level){
  cname <- colnames(tr[colindex])
  tr <- tr %>% mutate(cname = as.factor(replace(cname, is.na(cname), na_level)))
  return(tr)
}

for (i in 1:12) {
  if(i == 5){
      na_level <- 3;
      tr <- Replace_NAs(i,na_level);
  }
  else if(i == 11){
    na_level <- 5;
    tr <- Replace_NAs(i,na_level);
  }
  else if(i == 4|6|8){
    na_level <- 1;
    tr <- Replace_NAs(i,na_level);
  }
  else{
    na_level <- 20;
    tr <- Replace_NAs(i,na_level);
  }
}

请帮助我。谢谢。

【问题讨论】:

  • 我不明白你的问题。请包括一个可重复的数据示例和所需的输出。有了它,帮助你会容易得多。
  • 为呈现方式道歉。

标签: r for-loop dplyr


【解决方案1】:

正如约翰在 cmets 中提到的,您应该包含一个可重现的示例。没有它,我们只能猜测您到底想要什么。

也就是说,以下是我对什么会帮助你的猜测:

df %>%
    mutate_at(vars(5), ~ replace_na(., 3)) %>%
    mutate_at(vars(11), ~ replace_na(., 5)) %>%
    mutate_at(vars(4, 6, 8) ~ replace_na(., 1)) %>%
    mutate_at(vars(-c(4, 5, 6, 8, 11)), ~ replace_na(., 20))

再次,请提供一个可重复的示例,其中包含数据和您想要的输出。对您的问题的更可靠的答案是探索将预期开关列表应用于您的数据框,但这在这里有点过头了。

【讨论】:

    【解决方案2】:

    这是一种使用for 循环的方法。

    考虑这个例子:

    tr <- data.frame(a = c(NA, 2, NA, 3), b = c(2, 3, NA, 4), 
                     c = c(5, 6, NA, NA), d = c(1, 2, 3, NA))
    tr
    #   a  b  c  d
    #1 NA  2  5  1
    #2  2  3  6  2
    #3 NA NA NA  3
    #4  3  4 NA NA
    

    现在准备一个列索引列表和一个替换值向量

    cols <- list(1, c(2, 3))
    vals <- c(3, 5)
    

    使用for 循环将列替换为值

    for(i in seq_along(cols)) {
      tr[cols[[i]]][is.na(tr[cols[[i]]])] <- vals[i]
    }
    

    对于剩余的列

    f_cols <- setdiff(seq_len(ncol(tr)), unlist(cols))
    tr[f_cols][is.na(tr[f_cols])] <- 20
    
    tr
    #  a b c  d
    #1 3 2 5  1
    #2 2 3 6  2
    #3 3 5 5  3
    #4 3 4 5 20
    

    您会注意到第 1 列中的 NA 是如何替换为 3 的,第 2 列和第 3 列中的 NA 是如何替换为 5 的,而对于该列的其余部分,它是如何替换为 20。

    【讨论】:

    • 感谢您的努力@Ronak。有用。我可以将上面的 for 循环代码用于其他功能吗?例如:relevel 函数而不是 is.na()
    • 是的,您可能可以将其作为一个新问题来询问详细信息。
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多