Замените NA на 0 в зависимости от группы (строки) и имен переменных (столбец) - PullRequest
0 голосов
/ 29 января 2019

У меня большой набор данных, и я хочу заменить многие NA, но не все.

В одной группе я хочу заменить все NA на 0. В другой группе я хочу заменить все NA на 0, но только в переменных, которые не включают определенную часть имени переменной, например, 'b'

Вот пример:

group <- c(1,1,2,2,2)
abc <- c(1,NA,NA,NA,NA)
bcd <- c(2,1,NA,NA,NA)
cde <- c(5,NA,NA,1,2)
df <- data.frame(group,abc,bcd,cde)

  group abc bcd cde
1     1   1   2   5
2     1  NA   1  NA
3     2  NA  NA  NA
4     2  NA  NA   1
5     2  NA  NA   2

Это то, что я хочу:

  group abc bcd cde
1     1   1   2   5
2     1   0   1   0
3     2  NA  NA   0
4     2  NA  NA   1
5     2  NA  NA   2

Вот что я попробовал:

#set 0 in first group: this works fine
df[is.na(df) & df$group==1] <- 0
#set 0 in second group but only if the variable name includes b: does not work
df[is.na(df) & df$group==2 & !grepl('b',colnames(df))] <- 0

Приветствуются решения dplyr, а также базовые

Ответы [ 3 ]

0 голосов
/ 29 января 2019

В качестве альтернативы вы можете использовать:

library(dplyr)
df2 <- df %>% mutate_at(vars(names(df)[-1]),
         function(x) case_when((group==1 & is.na(x) ) ~ 0,
              (group==2 & is.na(x) & !grepl("b",deparse(substitute(x)))) ~ 0,
              TRUE ~ x))
> df2
  group abc bcd cde
1     1   1   2   5
2     1   0   1   0
3     2  NA  NA   0
4     2  NA  NA   1
5     2  NA  NA   2
0 голосов
/ 29 января 2019

Используя dplyr :: mutate_at, вы также можете сделать:

library(dplyr)

vars_mutate_1 <- names(df)[-1]
vars_mutate_2 <- grep(x = names(df)[-1], pattern = '^(?!.*b).*$', perl = TRUE, value = TRUE)

df %>% 
  mutate_at(.vars = vars_mutate_1, .funs = funs(if_else(group == 1 & is.na(.), 0, .))) %>%
  mutate_at(.vars = vars_mutate_2, .funs = funs(if_else(group == 2 & is.na(.), 0, .)))

  group abc bcd cde
1     1   1   2   5
2     1   0   1   0
3     2  NA  NA   0
4     2  NA  NA   1
5     2  NA  NA   2
0 голосов
/ 29 января 2019

Для второй группы создайте индекс столбца с grep и используйте его для подмножества данных при назначении

j1 <- !grepl('b',colnames(df))
df[j1][df$group == 2 & is.na(df[j1])] <- 0
df
#  group abc bcd cde
#1     1   1   2   5
#2     1   0   1   0
#3     2  NA  NA   0
#4     2  NA  NA   1
#5     2  NA  NA   2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...