如果满足条件则用新值替换值,如果不满足则用R保持值相同

问题描述 投票:2回答:3

我正在使用一个数据集,其中变量的缺失值用特定数字指定。我正在尝试创建一个数据框,在其中我将这些值替换为空白,将另一个数据框在其中将我替换为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))
r apply tidyverse missing-data mutate
3个回答
2
投票

这里,我们需要

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)

0
投票

在基本R中:

cols = c('card', 'lung', 'diabetes')
temp = df[, cols]
temp[temp == 8 | temp == 9] = NA
df[, cols] = temp

0
投票

一行简单

apply(your.data.frame, 1, function(x){ifelse(x==8| x==9, NA,x)})

因此:

your.data.frame <- matrix(c(12,3,4,5,6,78,8,11,8,9, 2,45,65.6,6,7,8,9,12 ), ncol=3)
new.data.frame <- t(apply(your.data.frame, 1, function(x){ifelse(x==8| x==9, NA,x)}))
new.data.frame     
[,1] [,2] [,3]
[1,] 12.0    3    4
[2,]  5.0    6   78
[3,]   NA   11   NA
[4,]   NA    2   45
[5,] 65.6    6    7
[6,]   NA   NA   12
© www.soinside.com 2019 - 2024. All rights reserved.