2016-04-26 5 views
2

Here is a link to my data. Es sieht wie folgt aus:R-Schleife lange Datenrückgabe Minimum und kumulative Werte

year cars company 
1975 11.75 chevy 
1976 19.71 chevy 
1977 21.23 chevy 
1978 11.00 chevy 
1979 8.26 chevy 
1980 8.63 chevy 
1981 19.09 chevy 
1982 30.52 chevy 
1983 27.51 chevy 

Ich möchte zwei neue Variable Spalten erstellen:

  1. year_first, welches das erste Jahr ein Unternehmen in den Daten aufgeführt wird zurückkehren würde (zB Dies wäre " 1975" für jeden ‚Chevy‘ row)
  2. cars_cumulative, die die kumulative Summe für alle Autos für ein bestimmtes Unternehmen produziert bis zu diesem Punkt

So zurückkehren würde, würde ich meine Daten gerne wie folgt aussehen:

year cars company year_first cars_cumulative 
1975 11.75 chevy 1975  11.75 
1976 19.71 chevy 1975  31.46 
1977 21.23 chevy 1975  52.69 
1978 11.00 chevy 1975  63.69 
1979 8.26 chevy 1975  71.95 
1980 8.63 chevy 1975  80.58 
1981 19.09 chevy 1975  99.67 
1982 30.52 chevy 1975  130.19 
1983 27.51 chevy 1975  157.70 

Ich denke, ich sollte eine for-Schleife schreiben? Ich bin nur nicht sicher, der beste Weg, es zu tun.

Antwort

6

die folgende Basen R Technik soll für eine data.frame df arbeiten:

df <- data.frame(year=1975:1983, 
       cars=c(11.75, 19.71, 21.23, 11, 8.26, 8.63, 19.09, 30.52, 27.51), 
       company=rep("chevy", length(1975:1983))) 
# add variables 
df$year_first <- ave(df$year, df$company, FUN=min) 
df$cars_cumulative <- ave(df$cars, df$company, FUN=cumsum) 

Eine schöne Ergänzung von @rawr erwähnt, ist, dass diese über Leitungen können in within gewickelt werden, die R, die Daten zu verwenden, sagt .frame als erster Bezugspunkt:

within(df, { 
    year_first <- ave(year, company, FUN=min) 
    cars_cumulative <- ave(cars, company, FUN=cumsum) 
}) 

die Verwendung von within nicht nur die Eingabe von vielen „df $“ Präfixen speichert, die den Code leichter zu lesen macht, aber es kann auch helfen, um Ihren Code zu organisieren , wie du die Schöpfung von allem machen kannst Ihrer zusätzlichen Variablen in einen Codeblock.

Wenn Sie mit einer sehr großen Datenmenge arbeiten, oder Sie wie prägnanter Code, Sie vielleicht einen Blick auf data.table nehmen:

library(data.table) 
setDT(df) 
df[, c("year_first", "cars_cumulative"):=list(min(year), cumsum(cars)), by="company"] 
# or 
df[, `:=`(year_first = year[1L], cars_cumulative = cumsum(cars)), by=company] 

oder mit dplyr:

library(dplyr) 
df2 = df %>% group_by(company) %>% 
    mutate(year_first = first(year), cars_cumulative = cumsum(cars)) 
+1

ich ein ersten nehmen lassen Crack bei der data.table-Methode. Wenn es Verbesserungen gibt, würde ich mich freuen, sie zu lernen. – lmo

+0

OK @Frank. weg bearbeiten. – lmo

+0

Das ist perfekt. Ich wusste nie von der Ave-Funktion. Unglaublich hilfreich. Vielen Dank! @Frank – Jim