вывести список данных, не работающий так же, как FUN, примененный к dfs индивидуально - PullRequest
0 голосов
/ 02 января 2019

пример данных

metro_2005_1 <- data.frame(col1 = 1:5, col2 = 6:10)
metro_2006_1 <- data.frame(col1 = 1:3, col2 = 4:6)

У меня есть 20 фреймов данных, каждый из которых назван в следующем формате, где x - это число 1-9:

metro_20XX_X

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

addYear <- function(metro){
   metro_name <- deparse(substitute(metro))
   metro <- metro %>% mutate(Year = substr(metro_name,7,10))
   return(metro)
   }

example <- addYear(metro_2005_1)

str(example)

'data.frame':   5 obs. of  3 variables:
  $ col1: int  1 2 3 4 5
  $ col2: int  6 7 8 9 10
  $ Year: chr  "2005" "2005" "2005" "2005" 

Я добавил все 20 своих фреймов данных в список с именем metro_append_year и попытался применить функцию addYear ко всем 20 фреймам данных, используя lapply. Однако, когда я проверяю «результат», столбец года создается в каждом из моих кадров данных, но пустой.

metro_append_year <- list(metro_2005_1, metro_2006_1)

result <- lapply(metro_append_year,addYear)

str(result[[1]])
'data.frame':   5 obs. of  3 variables:
 $ col1: int  1 2 3 4 5
 $ col2: int  6 7 8 9 10
 $ Year: chr  "" "" "" ""

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Поскольку вы новичок в R, рассмотрите базовое решение R, которое может извлечь список объектов с помощью mget и поэлементно выполнить итерацию с помощью Map (обертка до mapply) с помощью имен списков и соответствующих значений. Возможно, передача имен для псевдонимов столбцов без кавычек - проблема с вашим вызовом dplyr.

Функциональные зеркала within или transform dplyr::mutate, где можно назначить столбцы на месте для возврата объекта:

# ALL METRO DATA FRAMES
metro_dfs <- mget(ls(pattern="metro"))

metro_dfs <- Map(function(name, df) within(df, Year <- substr(name,7,10))),
                 names(metro_dfs), metro_dfs)

В качестве альтернативы:

metro_dfs <- mapply(function(name, df) transform(df, Year = substr(name,7,10))),
                    names(metro_dfs), metro_dfs, SIMPLIFY=FALSE)
0 голосов
/ 02 января 2019

Мы могли бы передать «данные» и имя элемента list как два аргумента.Теперь становится легче

addYear <- function(data, name){

   data %>% 
          mutate(Year = substr(name,7,10))

 }
lapply(names(metro_append_year), function(nm) addYear(metro_append_year[[nm]], nm))

data

metro_2005_1 <- data.frame(col1 = 1:5, col2 = 6:10)
metro_2006_1 <- data.frame(col1 = 1:3, col2 = 4:6)
metro_append_year <- mget(ls(pattern = '^metro_\\d{4}'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...