在 R 中,如果满足条件,则将值替换为新值,如果不满足,则保持值相同

标签 r apply tidyverse missing-data dplyr

我正在使用一个数据集,其中变量的缺失值是用特定数字指定的。我正在尝试创建一个数据框,在其中用空白替换这些值,并创建另一个数据框,在其中用 NA 替换它们。对于这个问题,我将重点关注它们被 NA 替换的数据框。

对于变量,缺失值由数字 8 或 9 指定。我觉得我可以使用 mutate_at() 来更改所有变量,或者可能使用 apply() 函数,但我愿意接受任何建议。我尝试编写的一般逻辑是:对于每个指定的列,如果值为 8 或 9,则替换为空白,否则保持值相同。

数据集的结构使得每一列代表一个变量。我试图从数据框中选择变量的子集,因为只有几列缺少值。我看过this example ,但它并没有完全回答我的问题。

我知道我可以做这样的事情,但这需要我指定数据框中所有其他值非缺失值的值。我更喜欢一个解决方案,我可以指定 8 和 9(缺失值)会发生什么,并且可以保持其他相同而不列出它们。

mutate_at(vars(card, lung, diabetes), function(x) case_when (x == 8 ~ "NA", x == 9 ~ "NA", x == 6 ~ 6, x == 4 ~ 4, x == 3 ~ 3, x == 2 ~ 2, x == 1 ~ 1))

最佳答案

在这里,我们需要

library(dplyr)
df1 %>%
      mutate_at(vars(card, lung, diabetes), ~ replace(., . %in% 8:9, NA))
#   card lung diabetes val
#1   NA    1        1   1
#2   NA    3        4   2
#3    1   NA        3   3
#4    2   NA        5   4
#5    3   NA       NA   5

或者,如果我们默认使用case_when,则TRUENA,因此条件可以是

df1 %>%
      mutate_at(vars(card, lung, diabetes),  ~ case_when(! . %in% 8:9 ~ .))
#   card lung diabetes val
#1   NA    1        1   1
#2   NA    3        4   2
#3    1   NA        3   3
#4    2   NA        5   4
#5    3   NA       NA   5

或者另一个选项是na_if

df1 %>%
    mutate_at(vars(card, lung, diabetes), ~ na_if(., 8) %>% na_if(.,9)) 
#  card lung diabetes val
#1   NA    1        1   1
#2   NA    3        4   2
#3    1   NA        3   3
#4    2   NA        5   4
#5    3   NA       NA   5

数据

df1 <- data.frame(card = c(8, 9, 1, 2, 3), lung = c(1, 3, 8, 9, 8),
     diabetes = c(1, 4, 3, 5, 8), val = 1:5)

关于在 R 中,如果满足条件,则将值替换为新值,如果不满足,则保持值相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61579192/

相关文章:

python - Pandas :如何更快地应用于数据框?

r - 什么!! R中的运算符均值

r - 快速连接data.table(潜在bug,上报前检查)

r - 确定 tibble 是否分组

r - 通过 data.table 在多列上从长到宽

haskell - 这个例子似乎打破了 $ 的类型 sig,它有效

javascript - 当 thisArg 与后续参数属于同一个数组时,function.prototype.apply 如何工作

r - 如何从 R 中的多个 id 中获取独占和总计数

r - 省略列而不是将它们放在 purrr 中

r - 在 Shiny 模块中使用模态窗口