#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(...)
вызов? Кажется, ничего не делает