Замените NA, используя вектор имен столбцов

#r #dplyr #tidyr

Вопрос:

У меня есть фрейм данных со столбцами, содержащими NA s, которые я заменяю с помощью replace_na . Проблема в том, что эти имена столбцов могут измениться в будущем, поэтому я хотел бы поместить эти имена столбцов в вектор, а затем использовать вектор в replace_na функции. Я не хочу изменять весь фрейм данных за один раз, только указанные столбцы. Когда я пытаюсь сделать это, как показано ниже, код запускается, но он не изменяет фрейм данных. Кто-нибудь может предложить какие-либо изменения в коде?

 library(tidyverse)
col1<-c(9,NA,25,26,NA,51)
col2<-c(9,5,25,26,NA,51)
col3<-c(NA,3,25,26,NA,51)
col4<-c(9,1,NA,26,NA,51)

data<-data.frame(col1,col2,col3,col4, stringsAsFactors = FALSE)

columns<-c(col1,col2)

data<-data%>%
  replace_na(list(columns=0))


 

Ответ №1:

Один dplyr из вариантов:

 columns <- c("col1" ,"col2")

dplyr::mutate(data, across(columns, replace_na, 0))
 

ВОЗВРАТ:

   col1 col2 col3 col4
1    9    9   NA    9
2    0    5    3    1
3   25   25   25   NA
4   26   26   26   26
5    0    0   NA   NA
6   51   51   51   51
 

Ответ №2:

Другим вариантом было бы использование coalesce внутри map_at :

  • at аргументом in map_at может быть вектор символов имен столбцов, которые вы хотели бы изменить
  • Затем мы используем coalesce функцию, чтобы указать замену NA s
 library(dplyr)
library(purrr)

data %>%
  map_at(c("col1","col2"), ~ coalesce(.x, 0)) %>%
  bind_cols()

# A tibble: 6 x 4
   col1  col2  col3  col4
  <dbl> <dbl> <dbl> <dbl>
1     9     9    NA     9
2     0     5     3     1
3    25    25    25    NA
4    26    26    26    26
5     0     0    NA    NA
6    51    51    51    51
 

Ответ №3:

columns значение должно быть строковым, затем вы можете использовать is.na его как —

 columns<-c("col1","col2")

data[columns][is.na(data[columns])] <- 0
data

#  col1 col2 col3 col4
#1    9    9   NA    9
#2    0    5    3    1
#3   25   25   25   NA
#4   26   26   26   26
#5    0    0   NA   NA
#6   51   51   51   51
 

Или с помощью tidyverse

 library(dplyr)
library(tidyr)

data <- data %>% mutate(across(all_of(columns), replace_na, 0))