Использование replace_na с помощью across в mutate

#r #dplyr

#r #dplyr

Вопрос:

Я пытаюсь заменить NA в подмножестве столбцов и хочу использовать синтаксис tidyverse / dplyr. dplyr v1.0.2

В следующем я хочу только заменить NAs на 999 в столбцах ab,ac, но не в ads

 tbf <- tibble( ab = c(1,3,NA), ac = c(23,NA,33), d = c(22,22,NA), ads = c('ds', NA, "dwe"))
tbf %>% mutate(across(starts_with('a') amp; where(is.numeric)), ~replace_na(999))
  

похоже, не работает.

Я ~replace_na(.x,999) тоже пытался. Это тоже не сработало.

Любая помощь приветствуется.

Ответ №1:

fn (который вы используете replace_na ) должен быть внутри across . Затем вам также необходимо сослаться на текущий столбец, вставив a . в replace_na . Таким образом, вы можете использовать фильтрацию, которую вы предлагаете в своем вопросе (столбцы, начинающиеся с «a» и с числовыми значениями), в отличие от других ответов здесь, в которых конкретно используются имена столбцов.

 tbf %>% mutate(across(starts_with('a') amp; where(is.numeric), ~replace_na(.,999)))
  

Ответ №2:

Данные

 tbf <- tibble( ab = c(1,3,NA), ac = c(23,NA,33), d = c(22,22,NA), ads = c('ds', NA, "dwe"))
  

Код

 library(dplyr)
library(tidyr)

tbf %>% 
  mutate(
    across(ab:ac, ~replace_na(.x, 999))
  )
  

Вывод

 #> # A tibble: 3 x 4
#>      ab    ac     d ads  
#>   <dbl> <dbl> <dbl> <chr>
#> 1     1    23    22 ds   
#> 2     3   999    22 NA 
#> 3   999    33    NA dwe
  

Создано 2020-09-19 пакетом reprex (версия 0.3.0)

Комментарии:

1. В чем разница между replace_na(.x, 999) и replace_na(., 999) ? Оба варианта сработали для меня, но я не понимаю первый.

Ответ №3:

Попробуйте это:

 #Code
tbf %>% mutate(across(ab:ac, ~ifelse(is.na(.),999,.)))
  

Вывод:

 # A tibble: 3 x 4
     ab    ac     d ads  
  <dbl> <dbl> <dbl> <chr>
1     1    23    22 ds   
2     3   999    22 NA   
3   999    33    NA dwe  
  

Ответ №4:

Пожалуйста, посмотрите, работает ли это.

 tbf %>% mutate(across(starts_with('a') amp; where(is.numeric), ~replace(., is.na(.), 999)))

> tbf %>% mutate(across(starts_with('a') amp; where(is.numeric), ~replace(., is.na(.), 999)))
# A tibble: 3 x 4
     ab    ac     d ads  
  <dbl> <dbl> <dbl> <chr>
1     1    23    22 ds   
2     3   999    22 NA   
3   999    33    NA dwe  
> 
  

Комментарии:

1. Ни replace_na, ни replace в across не сработали для меня, хотя, очевидно, это сработало для вас. Это удивительно. Не могли бы вы сказать мне, какую версию вы используете?

2. Я использую dplyr версии 1.0.0, как насчет вас?

3. Он отлично работал в чистом сеансе. Тем не менее, я принял ответ Juljo, но этот ответ тоже работает.

Ответ №5:

Вы также можете сделать это с tidyr помощью.

 tbf %>% 
  mutate(across(starts_with('a') amp; where(is.numeric))) %>% 
  replace_na(list(ab = 999, ac = 999))
  
 
    # A tibble: 3 x 4
         ab    ac     d ads  
      <dbl> <dbl> <dbl> <chr>
    1     1    23    22 ds   
    2     3   999    22 NA   
    3   999    33    NA dwe 
  

Комментарии:

1. Это близко, но я не хочу явно указывать имена столбцов в replace_na. Возможно ли это?

2. Это решение работает. Однако для чего вы здесь используете mutate(...) вызов? Кажется, ничего не делает