Преобразование значений во всех столбцах в определенное значение в tibble / dplyr - PullRequest
2 голосов
/ 27 января 2020

У меня есть объект tibble, и я хочу заменить все столбцы, кроме определенных, значением (скажем, NA или 0). Я могу сделать это без труб %>%, но как я могу сделать это с %>%?

library(tibble)  
dtf <- tibble(id = c('12', '22', '33', '40'),
              x1 = c(0, 2, 3, 4),
              a2 = c(1, 0, 3, 0),
              c5 = c('a', 'b', 'c', 'd'))

# This raises an error:
dtf %>% select(-id) <- NA

Error in dtf %>% select(-id) <- NA : could not find function "%>%<-"

# This works:
dtf[, colnames(dtf) != 'id'] <- NA
dtf
# A tibble: 4 x 4
  id    x1    a2    c5   
  <chr> <lgl> <lgl> <lgl>
1 12    NA    NA    NA   
2 22    NA    NA    NA   
3 33    NA    NA    NA   
4 40    NA    NA    NA 

Я считаю, что я должен использовать mutate() или mutate_all(), но я не мог понять, , Один аналогичный SO ответ предложил na_if() для NA значений, но я не могу заставить его работать в этом случае.

Ответы [ 3 ]

1 голос
/ 27 января 2020

Зависит от того, что вы хотите сделать.

  1. Измените все переменные одинаково и выберите по имени / месту:
df %>%
mutate_at(.vars = c("x1","a2","c5"), funs(case_when(is.na(.) ~ 0,TRUE ~ .)))

# or 

df %>%
mutate_at(.vars = -id, funs(case_when(is.na(.) ~ 0,TRUE ~ .)))
Измените все переменные одинаково и выберите по типу:
df %>%
mutate_if(is.numeric, funs(case_when(is.na(.) ~ 0,TRUE ~ .)))
1 голос
/ 27 января 2020

Если вы хотите обновить столбцы, используйте mutate_at

library(dplyr)
dtf <- dtf %>% 
           mutate_at(vars(-id), ~ NA)

Если нам нужно заменить на 0

dtf <- dtf %>%
          mutate_at(vars(-id), replace_na, 0)
0 голосов
/ 27 января 2020

вы просто делаете dtf[,colnames(dtf) != "id"] <- NA в одном go ... это заменит все значения столбца, кроме id на NA

...