【问题标题】:Replace NAs according to conditions [duplicate]根据条件替换 NA [重复]
【发布时间】:2016-08-29 00:16:50
【问题描述】:

我有一个包含大量数值变量的数据集,以及一个字符变量,用于说明该观察是否抑制了低值。在未抑制值的观察中,我想替换 NAs 0(仅用于特定变量),但我无法弄清楚。这是我的数据:

suppressed var1 var2
      none    2    6
      none   NA    6
      none    3    7
      none   NA   NA
      full    2    6
      full    3    6
      none    3   NA
      partial NA    6
      none    2    7
      none    NA   NA

如果 Suppressed=none,我想要做的是在 Var 1 中将 NA 更改为 0。我试过了

df$Var1<-if (df$suppressed=='none'&is.na(df$Var1)) 0 
         else df$Var1

得到了

Error in if (df$suppressed == "none" & is.na(df$Var1)) 0 else df$Var1 : 
  argument is of length zero

我的 if else 语句有问题吗,还是有其他方法可以做到这一点?

这是我的数据结构:

structure(list(suppressed = structure(c(2L, 2L, 2L, 2L, 1L, 1L, 2L, 3L, 2L, 2L), .Label = c("full", "none", "partial"), class = "factor"), var1 = c(2, NA, 3, NA, 2, 3, 3, NA, 2, NA), var2 = c(6, 6, 7, NA, 6, 6, NA, 6, 7, NA)), .Names = c("suppressed", "var1", "var2"), row.names = c(NA, -10L), class = "data.frame")

【问题讨论】:

  • 随便df[df$suppressed == 'none'&amp; is.na(df$var1), "var1"] &lt;- 0

标签: r if-statement na


【解决方案1】:

ifelse() 可以解决问题。它需要三个参数 - 条件、if 输出和 else 输出。

df$Var1 <- ifelse(df$suppressed == 'none' & is.na(df$Var1), 0, Var1)   

您的代码 {} 中没有任何大括号。

if(df$suppressed == 'none' & is.na(df$Var1)){
    df$Var1 <- 0
   }else{
    df$Var1 <- df$Var1
}

希望这会有所帮助。

【讨论】:

  • ifelse 完全没有必要满足一个条件。如果 else 部分已经存在,为什么还需要将 Var1 放入其中?
  • 我完全同意,但是看到他如何尝试使用 if 语句,我想向他展示 ifelse()。但是,我不能和你争论。
  • 另外,df$var1 == NA 并没有做你认为它正在做的事情。所以你的第二个选项行不通。
  • 没有。 R 不知道某物是否等于NA,因为它不知道NA 等于什么。这就是我们有is.na 函数的原因。因此,针对NA 进行测试的任何内容都将返回NA。例如,试试c(1, NA, "h") == NA。甚至只是NA == NA。一般来说,测试你的代码总是更好。
  • 虽然我同意您的回答对更一般的情况有用(+1)。但这里还有一些你可能想知道的stackoverflow.com/questions/16275149/…
猜你喜欢
  • 2023-02-13
  • 2023-03-21
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
相关资源
最近更新 更多