Ich möchte eine Zuordnung in einer Liste innerhalb eines data.frame erstellen, die Zeilen binden und eine Spalten-ID in einem Schritt wiederholen.

Ich konnte jeden Teil manuell ausführen, aber nicht in einem Schritt, wenn es eine Funktion oder eine bestimmte Möglichkeit gibt, die Zuordnungsfunktionen zu verwenden.

Datenheader:

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"))

Struktur:


  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                                        

So wie ich es mache und vereinfachen möchte:

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 

Erwünschtes Ergebnis:

                            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

BEARBEITEN: Die Spalte mecanicas kann auch eine leere Liste sein, ansonsten ist sie gut strukturiert.

EDIT2: Es wurde ein Randfall aus edit1 hinzugefügt, bei dem eine Liste leer ist (Fehler im Fall der Tidyverse-Lösung). Der andere Fehler (data.table-Lösung) konnte ich ohne die gesamten Daten nicht reproduzieren, daher teile ich ihn hier über einen Dropbox-Link. https://www.dropbox.com/s/boh8k0epay4gedh/bgg_mechanics. RData? Dl = 0

0
Ochetski 18 Jän. 2019 im 00:52

3 Antworten

Beste Antwort

Wenn ich das richtig verstehe, besteht data aus

  • eine Liste mecanicas von Datenrahmen mit identischer Struktur (Anzahl, Name und Typ der Spalten) und
  • ein Zeichenvektor title mit der gleichen Anzahl von Elementen wie Datenrahmen in mecanicas

Ein alternativer Ansatz besteht darin, rbindlist() zu verwenden, um die Datenstruktur zu "glätten", d. H. Die Teile zu einem großen Datenrahmen zu kombinieren.

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

Da das OP einige Fehler mit dem Produktionsdatensatz gemeldet hat, sind hier einige Überprüfungen aufgeführt, um zu überprüfen, ob die oben genannten Annahmen zutreffen:

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))
1
Uwe 17 Jän. 2019 im 23:15

Sie möchten tidyr::unnest:

library(tidyverse)

data %>% 
  unnest(mecanicas) %>% 
  select(name, title)
2
DiceboyT 17 Jän. 2019 im 21:57

Mit der Datentabelle können Sie lapply über mecanicas um title überschreiben, und der Titel wird für Sie wiederholt.

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
2
IceCreamToucan 17 Jän. 2019 im 22:13