Как заменить одно значение в списке фреймов данных - PullRequest
2 голосов
/ 29 сентября 2019

У меня есть список фреймов данных следующим образом:

dat_1 <- data.frame(x = c("A", "B", "C", "D") %>% as.factor)
dat_2 <- data.frame(x = c("A", "B", "C", "D") %>% as.character)
dat <- list("dat_1" = dat_1, "dat_2" = dat_2)

Некоторые столбцы являются факторами, а другие - символами.Мне нужно заменить любой экземпляр "C" на NA для всех кадров данных в списке.Как мне это сделать?

Я знаю, что могу сделать это, используя следующий код, но я хочу избежать жесткого кодирования каждого кадра данных в списке, если это возможно:

dat[["dat_2"]][dat[["dat_2"]] == "C"] <- NA

Ответы [ 4 ]

3 голосов
/ 29 сентября 2019

Прежде всего, способ, которым вы создали фрейм данных, приведет к тому, что столбцы фреймов данных будут иметь все значение.Я изменил ваш код следующим образом, чтобы первый фрейм данных был фактором, а второй фрейм данных - символом.

dat_1 <- data.frame(x = c("A", "B", "C", "D"))
dat_2 <- data.frame(x = c("A", "B", "C", "D"), stringsAsFactors = FALSE)
dat <- list("dat_1" = dat_1, "dat_2" = dat_2)

Мы можем использовать следующий код, чтобы заменить все буквы "C" на NA.

dat2 <- lapply(dat, function(x){
  x[] <- lapply(x, function(x) replace(x, x %in% "C", NA))
  return(x)
})

dat2
# $dat_1
#      x
# 1    A
# 2    B
# 3 <NA>
# 4    D
# 
# $dat_2
#      x
# 1    A
# 2    B
# 3 <NA>
# 4    D

Код не изменит типы столбцов.

lapply(dat2, function(x) sapply(x, class))
# $dat_1
#        x 
# "factor" 
# 
# $dat_2
#           x 
# "character" 
2 голосов
/ 29 сентября 2019

Мы можем использовать na_if

library(dplyr)
library(purrr)
map(dat, ~ .x %>%
             mutate_all(na_if, "C"))
#$dat_1
#     x
#1    A
#2    B
#3 <NA>
#4    D

#$dat_2
#     x
#1    A
#2    B
#3 <NA>
#4    D
2 голосов
/ 29 сентября 2019

Мы можем использовать dplyr::recode

library(dplyr)
purrr::map(dat, . %>% mutate_all(~recode(., "C"=NA_character_)))

#$dat_1
#     x
#1    A
#2    B
#3 <NA>
#4    D

#$dat_2
#     x
#1    A
#2    B
#3 <NA>
#4    D
2 голосов
/ 29 сентября 2019
lapply(dat, function (x) {sapply(x, function (y) {y <- as.character(y); y[which(y == "C")] <- NA; return (y)})})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...