Как отобразить фрейм данных с помощью столбца списка (для отображения) и идентификатора в R - PullRequest
0 голосов
/ 18 января 2019

Я хочу создать карту в списке внутри data.frame, связать строки и повторить идентификатор столбца за один шаг.

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

Заголовок данных:

data <- structure(list(mecanicas = list(structure(list(name = c("Campaign / Battle Card Driven", 
"Cooperative Play", "Grid Movement", "Hand Management", "Modular Board", 
"Role Playing"), objecttype = c("property", "property", "property", 
"property", "property", "property"), objectid = c("2018", "2023", 
"2676", "2040", "2011", "2028"), primarylink = c(0L, 0L, 0L, 
0L, 0L, 0L), itemstate = c("approved", "approved", "approved", 
"approved", "approved", "approved"), href = c("/boardgamemechanic/2018/campaign-battle-card-driven", 
"/boardgamemechanic/2023/cooperative-play", "/boardgamemechanic/2676/grid-movement", 
"/boardgamemechanic/2040/hand-management", "/boardgamemechanic/2011/modular-board", 
"/boardgamemechanic/2028/role-playing")), class = "data.frame", row.names = c(NA, 
6L)), structure(list(name = c("Action Point Allowance System", 
"Cooperative Play", "Hand Management", "Point to Point Movement", 
"Set Collection", "Trading"), objecttype = c("property", "property", 
"property", "property", "property", "property"), objectid = c("2001", 
"2023", "2040", "2078", "2004", "2008"), primarylink = c(0L, 
0L, 0L, 0L, 0L, 0L), itemstate = c("approved", "approved", "approved", 
"approved", "approved", "approved"), href = c("/boardgamemechanic/2001/action-point-allowance-system", 
"/boardgamemechanic/2023/cooperative-play", "/boardgamemechanic/2040/hand-management", 
"/boardgamemechanic/2078/point-point-movement", "/boardgamemechanic/2004/set-collection", 
"/boardgamemechanic/2008/trading")), class = "data.frame", row.names = c(NA, 
6L)), structure(list(name = c("Action Point Allowance System", 
"Auction/Bidding", "Card Drafting"), objecttype = c("property", 
"property", "property"), objectid = c("2001", "2012", "2041"), 
    primarylink = c(0L, 0L, 0L), itemstate = c("approved", "approved", 
    "approved"), href = c("/boardgamemechanic/2001/action-point-allowance-system", 
    "/boardgamemechanic/2012/auctionbidding", "/boardgamemechanic/2041/card-drafting"
    )), class = "data.frame", row.names = c(NA, 3L)), list()), 
    title = c("Gloomhaven", "Pandemic Legacy: Season 1", "Through the Ages: A New Story of Civilization", 
    "KLASK")), row.names = c(NA, -4L), class = c("tbl_df", "tbl", 
"data.frame"))

Состав:


  mecanicas            title                                        
  <list>               <chr>                                        
1 <data.frame [6 x 6]> Gloomhaven                                   
2 <data.frame [6 x 6]> Pandemic Legacy: Season 1                    
3 <data.frame [3 x 6]> Through the Ages: A New Story of Civilization
4 <list [0]>           KLASK                                        

То, как я это делаю и хочу упростить:

library('tidyverse')

### map and bind the rows
mechanics_binded <- map_dfr(data$mecanicas, bind_rows) 

### then count the mechanics for repetition
n_mecs <- lapply(data[['mecanicas']], nrow) %>% as.character() %>% as.numeric()

##(some lists can be empty, but none in the data sample)
n_mecs[is.na(n_mecs)] <- 0 


titles <- rep(data$title, n_mecs)

mechanics_binded$titles <- titles 

mechanics <- mechanics_binded [,c('name', 'jogos')]

mechanics 

Желаемый результат:

                            name                     title
1  Campaign / Battle Card Driven                Gloomhaven
2               Cooperative Play                Gloomhaven
3                  Grid Movement                Gloomhaven
4                Hand Management                Gloomhaven
5                  Modular Board                Gloomhaven
6                   Role Playing                Gloomhaven
7  Action Point Allowance System Pandemic Legacy: Season 1
8               Cooperative Play Pandemic Legacy: Season 1
9                Hand Management Pandemic Legacy: Season 1
10       Point to Point Movement Pandemic Legacy: Season 1

РЕДАКТИРОВАТЬ: столбец mecanicas также может быть пустым списком, в противном случае он хорошо структурирован.

EDIT2: добавлен один из крайних вариантов из edit1, что список пуст (ошибка в случае решения с изменением направления). Другая ошибка (решение data.table) мне не удалось воспроизвести без целых данных, поэтому я делюсь здесь через ссылку dropbox. https://www.dropbox.com/s/boh8k0epay4gedh/bgg_mechanics.RData?dl=0

Ответы [ 3 ]

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

С таблицей данных вы можете lapply больше mecanicas на title, и он будет повторять заголовок для вас.

library(data.table)
setDT(data)

data[, lapply(mecanicas, `[[`, 'name'), by = title]

#                                             title                            V1
#  1:                                    Gloomhaven Campaign / Battle Card Driven
#  2:                                    Gloomhaven              Cooperative Play
#  3:                                    Gloomhaven                 Grid Movement
#  4:                                    Gloomhaven               Hand Management
#  5:                                    Gloomhaven                 Modular Board
#  6:                                    Gloomhaven                  Role Playing
#  7:                     Pandemic Legacy: Season 1 Action Point Allowance System
#  8:                     Pandemic Legacy: Season 1              Cooperative Play
#  9:                     Pandemic Legacy: Season 1               Hand Management
# 10:                     Pandemic Legacy: Season 1       Point to Point Movement
# 11:                     Pandemic Legacy: Season 1                Set Collection
# 12:                     Pandemic Legacy: Season 1                       Trading
# 13: Through the Ages: A New Story of Civilization Action Point Allowance System
# 14: Through the Ages: A New Story of Civilization               Auction/Bidding
# 15: Through the Ages: A New Story of Civilization                 Card Drafting
0 голосов
/ 18 января 2019

Если я правильно понимаю, data состоит из

  • список mecanicas фреймов данных с идентичной структурой (номер, имя и тип столбцов) и
  • символьный вектор title с тем же количеством элементов, что и у фреймов данных в mecanicas

Альтернативный подход заключается в использовании rbindlist() для «выравнивания» структуры данных, то есть объединения частей в один большой фрейм данных.

library(data.table)
# combine pieces to large data frame, add id col
flat <- rbindlist(data$mecanicas, idcol = "title")
# replace number in id col by title from character vector
flat[, title := data$title[title]][]
# extract desired columns
flat[, .(name, title)]
                             name                                         title
 1: Campaign / Battle Card Driven                                    Gloomhaven
 2:              Cooperative Play                                    Gloomhaven
 3:                 Grid Movement                                    Gloomhaven
 4:               Hand Management                                    Gloomhaven
 5:                 Modular Board                                    Gloomhaven
 6:                  Role Playing                                    Gloomhaven
 7: Action Point Allowance System                     Pandemic Legacy: Season 1
 8:              Cooperative Play                     Pandemic Legacy: Season 1
 9:               Hand Management                     Pandemic Legacy: Season 1
10:       Point to Point Movement                     Pandemic Legacy: Season 1
11:                Set Collection                     Pandemic Legacy: Season 1
12:                       Trading                     Pandemic Legacy: Season 1
13: Action Point Allowance System Through the Ages: A New Story of Civilization
14:               Auction/Bidding Through the Ages: A New Story of Civilization
15:                 Card Drafting Through the Ages: A New Story of Civilization

Поскольку OP сообщил о некоторых ошибках в наборе производственных данных, вот несколько проверок, чтобы проверить правильность вышеприведенных предположений:

library(magrittr)
# check that number of columns of data frames is consistent
stopifnot(lengths(data$mecanicas) %>% all(.[1] == .))
# or, without piping:
(tmp <- lengths(data$mecanicas))
stopifnot(all(tmp[1] == tmp))
# check that number of data frames and titles is consistent
stopifnot(length(data$mecanicas) == length(data$title))
0 голосов
/ 18 января 2019

Вы хотите tidyr::unnest:

library(tidyverse)

data %>% 
  unnest(mecanicas) %>% 
  select(name, title)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...