2017-02-02 2 views
0

Im Moment habe ich 16 Datenframes, die ich den Cast-Befehl über sie in einem Treffer und nicht einzeln ausführen möchte. Ich kann dies erfolgreich mit dem lapply (siehe Code unten) tun. Die Daten werden jedoch in eine Liste einer Liste geschrieben, und ich möchte die Daten lieber als separate Datenfelder verwalten. (Dies ist wahrscheinlich ineffizient, aber ich brauche verschiedene Stücke von Netzwerkanalyse auf die Daten zu tun und möchte sie halten trennen)Verwendung von Lapply, unsichtbar und über verschiedene Datenrahmen geworfen, um neue Datenrahmen zu erstellen

require(dplyr) 
require(readr) 
require(data.table) 
library(reshape) 

lapply(prolist,function(x) cast(x, mgrname ~ ticker, fun.aggregate = sum ,value = "shares")) 

wo PROLIST den Namen der verschiedenen Datenrahmen enthält, die ich die Funktion anwenden möchten zu.

Ich habe den unsichtbaren Code in einer ähnlichen Situation gefunden und benutzt, die die separaten Datenframes erzeugte, aber dieses Mal kann ich es nicht zum Laufen bringen. Mein Code ist: Beachten Sie die Cast-Funktion kommt aus dem Umgestaltungspaket.

invisible(lapply(prolist,function(x) cast(x, mgrname ~ ticker, fun.aggregate = sum ,value = "shares") 
     { assign(paste0("summary", x), x, pos=.GlobalEnv) })) 

Der Fehler ist:

Error: unexpected '{' in: 

„unsichtbar (lapply (PROLIST, Funktion (x) Besetzung (x, mgrname ~ Ticker, fun.aggregate = Summe, value = "Aktien") {“

Das Dateiformat geht wie mit einer Datei für jedes Quartal des Jahres.

| mgrname | ticker | share | 
|---------|--------|-------| 
| Man A | AAPL |  20| 
| Man A | MSFT |  30| 
| Man A | TLSA |  40| 
| Man B | AAPL |  20| 
| Man B | MSFT |  10| 
| Man B | TLSA |  50| 
| Man C | AAPL |  20| 
| Man C | MSFT |  20| 
| Man C | TLSA |  80| 

Jede Hilfe würde wie immer sehr geschätzt werden.

+0

Versuchen Sie folgendes: 'unsichtbar (lapply (PROLIST, Funktion (x) {Besetzung (x, mgrname ~ Ticker, fun.aggregate = Summe, value = "Aktien"); zuweisen (paste0 ("Zusammenfassung", x), x, pos = .GlobalEnv)})) ' – Sathish

+1

plazieren Sie' {} 'am Anfang und Ende des Funktionskörpers und setzen Sie' semicolon-; 'zwischen Anweisungen. – Sathish

+0

Welches Paket ist "Cast"? Wenn nicht Basis, bitte alle 'Bibliothek' Zeilen einbeziehen. Auch, welches Format hat die * Liste der Listen *. Sie können Listenelemente möglicherweise in einen Datenrahmen binden. Bitte illustrieren Sie mit Daten. – Parfait

Antwort

0
# sample data 
df1 <- structure(list(mgrname = c("Man A", "Man A", "Man A", "Man B", "Man B", "Man B", "Man C", "Man C", "Man C"), 
         ticker = c("AAPL", "MSFT", "TLSA", "AAPL", "MSFT", "TLSA", "AAPL", "MSFT", "TLSA"), 
         share = c(20L, 30L, 40L, 20L, 10L, 50L, 20L, 20L, 80L)), 
       .Names = c("mgrname", "ticker", "share"), 
       row.names = c(NA, -9L), 
       class = "data.frame") 


# create a sample list with the df1 
prolist <- list(df1, df1, df1, df1) 

# assign names to the list of data frames 
names(prolist) <- LETTERS[1:4] 
names(prolist) 
# [1] "A" "B" "C" "D" 

# load data table library, so we can use dcast() function from it. It is the same function in reshape2 package, but works well with large data 
library('data.table') 
invisible(lapply(names(prolist), 
        function(y) assign(x  = y, # paste0('summary', y) 
             value = dcast(prolist[[y]], mgrname ~ ticker, fun.aggregate = sum, value.var = 'share'), 
             envir =.GlobalEnv))) 

ls() 
# [1] "A"  "B"  "C"  "D"  "df1"  "prolist" 

A 
# mgrname AAPL MSFT TLSA 
# 1 Man A 20 30 40 
# 2 Man B 20 10 50 
# 3 Man C 20 20 80 
B 
# mgrname AAPL MSFT TLSA 
# 1 Man A 20 30 40 
# 2 Man B 20 10 50 
# 3 Man C 20 20 80 
C 
# mgrname AAPL MSFT TLSA 
# 1 Man A 20 30 40 
# 2 Man B 20 10 50 
# 3 Man C 20 20 80 
D 
# mgrname AAPL MSFT TLSA 
# 1 Man A 20 30 40 
# 2 Man B 20 10 50 
# 3 Man C 20 20 80 
Verwandte Themen