Функция Nest на нескольких фреймах данных - PullRequest
0 голосов
/ 01 июля 2018

У меня есть несколько фреймов данных с отношениями между фирмой и консультантом, по одному на каждый год интереса.

Например, фрейм данных 2015 года выглядит следующим образом. Давайте назовем его «советники2015» (тогда у меня есть также «советники2014», «советники2013», «советники 2012» и т. Д.):

> advisors2015
       [,1]   [,2]                    [,3]           [,4]                        
colnam "Mark" "Company.name"          "Company.ID"   "Advisor.Name"              
row1   "1"    "VOLKSWAGEN AG"         "DE2070000543" "PRICEWATERHOUSECOOPERS"    
row2   " "    "VOLKSWAGEN AG"         "DE2070000543" "PWC DEUTSCHE REVISION"     
row3   " "    "VOLKSWAGEN AG"         "DE2070000543" "C&L TREUARBEIT REVISION"   
row4   "2"    "ROYAL DUTCH SHELL PLC" "GB04366849"   "LLOYDS TSB REGISTRARS"     
row4   "2"    "ROYAL DUTCH SHELL PLC" "GB04366849"   "LLOYDS TSB REGISTRARS"     
row5   " "    "ROYAL DUTCH SHELL PLC" "GB04366849"   "PRICEWATERHOUSECOOPERS"
row6   " "    "ROYAL DUTCH SHELL PLC" "GB04366849"   "KPMG ACCOUNTANTS NV"       
row7   " "    "ROYAL DUTCH SHELL PLC" "GB04366849"   "ERNST & YOUNG"             
row8   "3"    "BP PLC"                "GB00102498"   "CAPITA ASSET SERVICES"     

А это на 2014 год:

> advisors2014
         [,1]   [,2]                    [,3]           [,4]                        
colnam "Mark" "Company.name"          "Company.ID"   "Advisor.Name"              
row1   "1"    "VOLKSWAGEN AG"         "DE2070000543" "PRICEWATERHOUSECOOPERS"    
row2   " "    "VOLKSWAGEN AG"         "DE2070000543" "PWC DEUTSCHE REVISION"     
row3   " "    "VOLKSWAGEN AG"         "DE2070000543" "C&L TREUARBEIT REVISION"   
row4   "2"    "ROYAL DUTCH SHELL PLC" "GB04366849"   "LLOYDS TSB REGISTRARS"     
row5   " "    "ROYAL DUTCH SHELL PLC" "GB04366849"   "PRICEWATERHOUSECOOPERS"
row6   "3"    "BP PLC"                "GB00102498"   "CAPITA ASSET SERVICES"     
row7   "4"    "COCACOLA"              "GB111222333"  " "                         

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

Чтобы отслеживать все эти изменения, я хотел бы иметь базу данных, в которой для каждого наблюдения за компанией / годом я сохраняю список советников.

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

Может ли кто-нибудь помочь мне решить эту проблему? Большое спасибо.

1 Ответ

0 голосов
/ 01 июля 2018

Если вы ищете один фрейм данных, в котором столбцы year, Company.name и столбец, содержащий список, каждый из элементов которого является фреймом данных, содержащим строки для этого года и Company.name, то:

library(dplyr)
library(purrr)
library(tidyr)

ls(pattern = "^advisors\\d{4}$", envir = .GlobalEnv) %>%
  mget(envir = .GlobalEnv) %>%
  map_dfr(as.data.frame.matrix, .id = "year") %>%
  mutate(year = sub("advisors", "", year) %>% as.numeric) %>%
  nest(-c(year, Company.name))

дает:

# A tibble: 6 x 3
   year Company.name          data                
  <dbl> <fct>                 <list>              
1 2015. VOLKSWAGEN AG         <data.frame [3 x 3]>
2 2015. ROYAL DUTCH SHELL PLC <data.frame [4 x 3]>
3 2015. BP PLC                <data.frame [1 x 3]>
4 2016. VOLKSWAGEN AG         <data.frame [3 x 3]>
5 2016. ROYAL DUTCH SHELL PLC <data.frame [4 x 3]>
6 2016. BP PLC                <data.frame [1 x 3]>

или если вы просто хотите получить длинный фрейм данных, пропустите строку nest.

Примечание

Мы предполагаем, что ввод:

advisors2015 <- 
structure(list(Mark = c(1L, NA, NA, 2L, NA, NA, NA, 3L), 
Company.name = structure(c(3L, 
3L, 3L, 2L, 2L, 2L, 2L, 1L), .Label = c("BP PLC", "ROYAL DUTCH SHELL PLC", 
"VOLKSWAGEN AG"), class = "factor"), Company.ID = structure(c(1L, 
1L, 1L, 3L, 3L, 3L, 3L, 2L), .Label = c("DE2070000543", "GB00102498", 
"GB04366849"), class = "factor"), Advisor.Name = structure(c(6L, 
8L, 1L, 5L, 7L, 4L, 3L, 2L), .Label = c("C&L TREUARBEIT REVISION", 
"CAPITA ASSET SERVICES", "ERNST & YOUNG", "KPMG ACCOUNTANTS NV", 
"LLOYDS TSB REGISTRARS", "PRICEWATERHOUSECOOPERS", "PRICEWATERHOUSECOOPERS LLP", 
"PWC DEUTSCHE REVISION"), class = "factor")), 
class = "data.frame", row.names = c(NA, -8L))

advisors2015 <- advisors2016 <- as.table(as.matrix(advisors2015))
...