#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
аргументом inmap_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))