2017-11-24 3 views
-2

Ich habe eine Liste wie diese (in Wirklichkeit sehr groß ist)Listen: Arbeiten mit Unterlisten der Mutterliste

name   attr1   attr2 
supplier1 10   87 
supplier1 11   88 
supplier1 12   89 
supplier1 13   21 
supplier2 20   31 
supplier2 21   75 
supplier2 22   75 
supplier3 30   47 
supplier3 19   22 

Ich muss separat mit jedem Lieferanten arbeiten.

Sagen wir, ich muss Mittelwert berechnen und ein Diagramm für jeden Anbieter grafisch darstellen. Sagen wir mal, ich muss jedes Mittel (txt-Datei) und jedes Diagramm (pdf/jpeg-Datei) mit dem Namen des Lieferanten speichern (den ich von der Liste bekommen sollte).

Ich bin sehr neu in R, wenn Sie können, würde eine Erklärung wirklich geschätzt werden!

+3

Lesen Sie mehr über 'split' und 'lapply'. – zx8754

+1

Sind Sie sicher, dass es sich um ein Listenformat und nicht um einen Datenrahmen handelt? – AntoniosK

+1

@AntoniosK Ich denke, sie bedeuten nicht "R Liste Objekt" sondern "Zeilen von Daten". – zx8754

Antwort

1

Ich glaube, es muss einige Duplikate für diese Frage auf SO geben. Da bei dieser Frage jedoch separate Ausgabedateien für jede Aggregationsstufe erstellt werden müssen, bin ich mir nicht sicher, ob ein Tippfehler einfach gefunden wird.

Sie können versuchen, Ihren Weg entlang der folgenden Vorschläge zu arbeiten:

library(data.table) 
setDT(DF)[, lapply(.SD, mean), by = name] 
 name attr1 attr2 
1: supplier1 11.5 71.25000 
2: supplier2 21.0 60.33333 
3: supplier3 24.5 34.50000 

Wenn Sie eine separate txt-Datei für jeden Lieferanten benötigen:

setDT(DF)[, fwrite(c(name = name, lapply(.SD, mean)), paste0(name, ".txt")), by = name] 

zu erstellen eine Datei für jede name, die ein einzelnes Diagramm enthält:

library(ggplot2) 
DF[, {ggplot(.SD) + aes(attr1, attr2) + geom_point() + ggtitle(name); 
    ggsave(paste0(name, ".png"))}, by = name] 

Z. B. Datei supplier1.png enthält:

enter image description here

0

Diese Lösung wird unter Verwendung von Paketen dplyr, purrr, tidyr und ggplot2 (für die Zwecke Plotten).

# example dataset 
df = read.table(text = " 
       name   attr1   attr2 
       supplier1 10   87 
       supplier1 11   88 
       supplier1 12   89 
       supplier1 13   21 
       supplier2 20   31 
       supplier2 21   75 
       supplier2 22   75 
       supplier3 30   47 
       supplier3 19   22 
       ", header=T, stringsAsFactors=F) 

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


df %>% 
    group_by(name) %>%          # for each supplier 
    nest() %>%            # nest data 
    mutate(MEANS = map(data, ~ .x %>% summarise_all(mean)), # obtain mean of rest of columns 
     PLOTS = map2(data, name,       # plot data and use the supplier as a title 
        ~ggplot(data = .x) + 
         geom_point(aes(attr1, attr2)) + 
         ggtitle(.y))) -> df_upd    # save this a new data frame 

# # check how your new dataset looks like 
df_upd 

# # A tibble: 3 x 4 
#   name    data   MEANS PLOTS 
#   <chr>   <list>   <list> <list> 
# 1 supplier1 <tibble [4 x 2]> <tibble [1 x 2]> <S3: gg> 
# 2 supplier2 <tibble [3 x 2]> <tibble [1 x 2]> <S3: gg> 
# 3 supplier3 <tibble [2 x 2]> <tibble [1 x 2]> <S3: gg> 

Für jeden Lieferanten Wert haben Sie Spalte data (eine Liste von Datenrahmen mit aktuellen Daten), Spalte MEANS (eine Liste von Datenrahmen mit den berechneten Mittel) und Spalte PLOTS (eine Liste der Plots Ihrer Daten).

daher so weit haben Sie es geschafft, eine (neu) Datenrahmen mit früheren/Original info (Spalte data) und berechnet info (Spalten MEANS und PLOTS) zu erstellen. Der nächste Schritt ist die neue Informationen in separaten Dateien zu speichern, wie Sie erwähnt haben:

# save each MEANS dataset in a separate file using the corresponding name 
map2(df_upd$MEANS, df_upd$name, ~ write.csv(.x, .y, row.names = F)) 

# save each plot separately using the corresponding name 
map2(df_upd$PLOTS, df_upd$name, ~ .x + ggsave(paste0(.y, ".png"))) 

Beachten Sie, dass die Informationen dieses Datenrahmens wie jeder andere Datenrahmen zugreifen können. Zum Beispiel: df_upd$MEANS wird Ihnen die Liste der Datenrahmen aller berechneten Mittel wird df_upd$MEANS[df_upd$name == "supplier2"] Sie geben den vorherigen Informationen für supplier2, df_upd$data[df_upd$name == "supplier3"] geben Ihnen die (original) Attribute für supplier3 usw.

Verwandte Themen