R Изменение формата на столбцы данных с использованием функционального программирования. - PullRequest
1 голос
/ 03 апреля 2020

Ситуация следующая: у меня есть список фреймов данных, и для каждого фрейма данных у меня есть список столбцов, формат которых мне нужно изменить. Настройка:

df1 <- data.frame(a = c("2020-03-02", "2020-12-22", "2020-07-03"), b = c(4, 5, 6), c = c("2020-03-13", "2019-11-03", "2011-05-02"))

df2 <- data.frame(d = c(1, 2, 3), e = c("2020-05-21", "2014-08-31", "1999-01-21"), f = c(7, 8, 9))

datasets <- list("first" = df1, "second" = df2)

dates <- list("first" = c("a", "c"), "second" = c("e")) 

Это можно сделать следующим образом: 1. Цикл по списку фреймов данных, 2. для каждого фрейма данных, цикл по списку столбцов, который нужно изменить, и переназначить их на месте. Примерно так:

for (i in names(datasets)) {
   for (j in dates[i]) {
      for (k in datasets[[i]][j]) {
         k <- as.Date(k)
      }
   }
} 

Это ужасно, поэтому я хотел попробовать сделать то же самое, используя purrr. Я подумал, что это будет хорошей идеей:

library(purrr)

walk2(datasets, dates, ~ walk(.x[.y], ~ {.x <- as.Date(.x)}))

Но наборы данных остаются невозмущенными после этой операции. Почему?

1 Ответ

1 голос
/ 03 апреля 2020

Вот решение, которое использует purrr и dplyr:

library(purrr)
library(dplyr)

datasets <- datasets %>% 
  imap(~{
    .x %>% 
      mutate_at(vars(dates[[.y]]), as.Date)
  })

str(datasets)
#List of 2
#$ first :'data.frame': 3 obs. of  3 variables:
# ..$ a: Date[1:3], format: "2020-03-02" "2020-12-22" "2020-07-03"
# ..$ b: num [1:3] 4 5 6
# ..$ c: Date[1:3], format: "2020-03-13" "2019-11-03" "2011-05-02"
#$ second:'data.frame': 3 obs. of  3 variables:
# ..$ d: num [1:3] 1 2 3
# ..$ e: Date[1:3], format: "2020-05-21" "2014-08-31" "1999-01-21"
# ..$ f: num [1:3] 7 8 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...