我正在使用一个数据集,其中变量的缺失值是用特定数字指定的。我正在尝试创建一个数据框,在其中用空白替换这些值,并创建另一个数据框,在其中用 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
,则TRUE
为NA
,因此条件可以是
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/