Замена строки в нескольких фреймах данных на lapply - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь заменить строку в нескольких фреймах данных, сохраненных в списке, другой строкой. Ниже приведен типичный код того, что мне нужно. В этом примере я пытаюсь заменить слово «белый» на «синий» в dat1 и dat2, но замена не работает. Проблема с моей индексацией df.list? Я попытался проиндексировать df.list $ D в as.character (), но выскочила ошибка.

dat1 <- data.frame(c(1,2,3,4), c(10, 20, 30, 40),
                   c(100, 200, 300, 400), c("red G white 40 R3", "red G white 40 R5", 
                                            "red H white 40 R7", "red H white 40 R10"))
dat2 <- data.frame(c("red G white 40 R3", "red G white 40 R5", 
                      "red H white 40 R7", "red H white 40 R10"))

colnames(dat1) <- c("A", "B", "C", "D")
colnames(dat2) <- c("D")

df.list <- list(dat1, dat2)

for(i in 1:length(df.list)){
  df.list[[i]]$D <- lapply(df.list, function(df.list) sub("white", "blue",
                                                                 as.character(df.list$D), fixed = TRUE))
}

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Мы можем использовать transform в base R

df.list <- lapply(df.list, transform, D = sub('white', 'blue', D))

Или используя tidyverse

library(dplyr)
library(purrr)
library(stringr)
df.list <- map(df.list, ~ .x %>%
                           mutate(D = str_replace(D, 'white', 'blue')))
0 голосов
/ 17 июня 2020

Не используйте for l oop и lapply. Используйте любой из них:

df.list <- lapply(df.list, function(x) {x$D <- sub('white', 'blue', x$D);x})
df.list

#[[1]]
#  A  B   C                 D
#1 1 10 100  red G blue 40 R3
#2 2 20 200  red G blue 40 R5
#3 3 30 300  red H blue 40 R7
#4 4 40 400 red H blue 40 R10

#[[2]]
#                  D
#1  red G blue 40 R3
#2  red G blue 40 R5
#3  red H blue 40 R7
#4 red H blue 40 R10

Используйте gsub, если вы хотите заменить несколько вхождений 'white' на 'blue'.

Чтобы вернуть данные обратно в отдельные фреймы данных, назовите перечислите и используйте list2env.

names(df.list) <- paste0('dat', 1:2)
list2env(df.list, .GlobalEnv)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...