Замените значения новым значением, если условие выполнено, или оставьте значение таким же, если нет, в R - PullRequest
2 голосов
/ 03 мая 2020

Я использую набор данных, в котором пропущенные значения переменных указаны с указанием c чисел. Я пытаюсь создать один фрейм данных, где я заменяю эти значения пробелами, а другой фрейм данных, где я заменяю их NA. В этом вопросе я остановлюсь на фрейме данных, где они заменены на NA.

Для переменных отсутствующие значения определяются числами 8 или 9. Мне кажется, что я мог бы использовать mutate_at (), чтобы изменить их все или, возможно, функцию apply (), но я открыт для любых предложений. , Общая логика c, которую я пытаюсь записать, такова: для каждого указанного столбца, если значение равно 8 или 9, замените его пустым, иначе оставьте значение таким же.

Набор данных структурирован так, чтобы каждый столбец представляет одну переменную. Я пытаюсь выбрать подмножество переменных в кадре данных, так как только несколько столбцов имеют пропущенные значения. Я посмотрел на этот пример , но он не полностью отвечает на мой вопрос.

Я знаю, что мог бы сделать что-то подобное, но для этого потребовалось бы указать значения всех других значений, не пропущенные значения в кадре данных. Я бы предпочел решение, в котором я могу указать, что происходит с 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))

Ответы [ 3 ]

3 голосов
/ 03 мая 2020

Здесь нам нужно

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

data

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 голосов
/ 03 мая 2020

в одну простую строку

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
0 голосов
/ 03 мая 2020

В базе R:

cols = c('card', 'lung', 'diabetes')
temp = df[, cols]
temp[temp == 8 | temp == 9] = NA
df[, cols] = temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...