【问题标题】:Replace certain variables with NA, one variable is NA用NA替换某些变量,一个变量是NA
【发布时间】:2020-03-24 10:32:04
【问题描述】:

如果我想根据条件用 NA 替换某些变量,最好使用什么函数?

如果 status = NA,则 score_1:score_3 将为 NA

试过了:

if(df2$status == NA){
 df2$score_2 <- NA
}else{
  df2$score_2 <- df$score_2
}

提前致谢

【问题讨论】:

    标签: r conditional-statements na


    【解决方案1】:

    您可以通过找出数据框中的哪些行是NA,然后将这些行中的列设置为NA来做到这一点。

    df <- data.frame(client_id = 1:4,
           Date = 1:4,
           Status = c(1, NA, 1, NA),
           Score1 = runif(4)*100,
           Score2 = runif(4)*100,
           Score3 = runif(4)*100)
    
    idx <- is.na(df$Status)
    
    df[idx, 4:6] <- NA
    
    df
    #>   client_id Date Status   Score1   Score2   Score3
    #> 1         1    1      1 48.08677 16.62185 91.80062
    #> 2         2    2     NA       NA       NA       NA
    #> 3         3    3      1 14.04552 64.55724 56.45998
    #> 4         4    4     NA       NA       NA       NA
    

    【讨论】:

    • 谢谢!这对多行的 df 有用吗?比如 80 还是 100?
    • 是的。 idx 会为 Status 列找到所有 NA 行。
    • 在这种情况下我必须知道变量的位置,对吧?我有很多变量必须用 NA 替换,但它们不按顺序排列。那我应该先订购吗?
    • 在有多个变量的情况下,您必须按位置或名称知道要替换哪些变量。 @akruns answer 提供了一种方法,通过匹配列名而不是位置来做到这一点。
    【解决方案2】:

    一种选择是在“状态”中找到NAs,并将以“分数”作为列名的列分配给base R中的NA

    i1 <- is.na(df2$Status)
    df2[i1, grep("^Score_\\d+$", names(df2))] <- NA
    

    或者dplyr中的一个选项

    library(dplyr)
    df2 %>%
         mutate_at(vars(starts_with('Score')), ~ replace(., is.na(Status), NA))
    

    【讨论】:

    • 谢谢,我一直收到错误消息说对象状态不存在
    • @DanielleTravassos 在您的图像中,它显示Status,而在您的代码中它是status。 R 区分大小写。因此,请将名称更改为正确的列名。我更新了代码
    • 嗨,阿克伦,谢谢。这是状态,我仍然收到此消息。我可能做错了什么?
    • @DanielleTravassos 你能发布'df2'的列名colnames(df2)。可能有一些领先/落后的空间
    • 这很好用。谢谢@akrun 和@Jake!我希望我可以选择这两个答案都有帮助!
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 2013-08-06
    • 2019-02-05
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多