2016-08-12 22 views
0

Ich arbeite mit einer FAO-Datenbank der landwirtschaftlichen Pflanzenproduktion nach Land. Insbesondere habe ich eine Datentabelle Reisproduktion von Jahr aus jedem Land der Welt im Jahr 1961 bis 2014 hier eine vereinfachte Version meiner Daten beginnt, zeigt:R - Bedingte mathematische Ausdruck in Datentabelle

d <- data.table(structure(list(Year = c(1961, 1962, 1963, 1964, 1965, 1966, 1967, 
1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 
1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 
1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 
2012, 2013, 2014, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 
1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 
1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 
1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 
2002, 2003, 2004, 2005, 2006), Country = c("Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania", "Albania", "Albania", "Albania", "Albania", "Albania", 
"Albania"), totalprod = c(319000, 319000, 319000, 380000, 380000, 
337000, 396000, 402000, 407000, 366000, 350000, 4e+05, 420000, 
420000, 435000, 448000, 4e+05, 428000, 439000, 415000, 390000, 
364000, 350000, 334000, 317000, 336000, 324000, 343000, 320000, 
333000, 335000, 3e+05, 3e+05, 342000, 390000, 340000, 4e+05, 
450000, 280000, 260000, 242000, 388000, 434000, 463000, 485000, 
540000, 552000, 612000, 645000, 672000, 672000, 5e+05, 512094, 
537000, 4603, 5683, 9135, 8173, 10225, 10524, 11254, 12807, 14276, 
14924, 10760, 12000, 15168, 12000, 13500, 14000, 14400, 14800, 
15520, 13000, 13900, 11900, 13000, 12600, 12000, 11000, 10600, 
8830, 8450, 7000, 2283, 960, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0)), .Names = c("Year", "Country", "totalprod"), class = "data.frame", row.names = c(NA, 
-100L))) 

Ich brauche diese Datentabelle in zwei verschiedenen zusammenfassen Möglichkeiten:

a) Zuerst muss ich die globale Reisproduktion pro Jahr berechnen, indem ich die Produktion jedes Landes pro Jahr aggregiere. Ich schaffte es, dies zu beantworten, indem Sie:

d.global.year <- d[, list(totalprodyear=sum(totalprod)), by=Year] 

b) Sobald ich die globale Reisproduktion pro Jahr habe, ich brauche jedes Land Beitrag pro Jahr zu bestimmen. Dies würde dadurch erreicht, dass die Produktion jedes Landes jährlich auf die globale Reisproduktion aufgeteilt wird.

Allerdings versuche ich immer noch, einen Weg zu lösen b).

EDITED: Erwartete Ausgabe:

ist zum Beispiel Lassen Sie nehmen der weltweite Reisverbrauch für 1961: 323.603

In diesem Fall Afghanistan Beitrag würde 319000/323603 = 0,986 und Albanien sein würde 4603/323603 = 0.014

Irgendwelche Tipps?

Antwort

1

Sie können es in einem two-stage groupby Prozess zunächst Gruppe von Year und das Gesamtprodukt für jedes Jahr berechnen, und dann die Gruppe sowohl Year und Country, wo Sie das gesamte Produkt in der vorherige Stufe berechnet können die zur Berechnung Anteil der Beitrag jedes Landes:

sumDt <- d[, totalprodyear :=sum(totalprod), by=Year] 
      [, .(totalprodyear, percentprod = sum(totalprod)/totalprodyear), by = .(Year, Country)] 
sumDt[, head(.SD, 3), by = Country] 
#  Country Year totalprodyear percentprod 
# 1: Afghanistan 1961  323603 0.98577578 
# 2: Afghanistan 1962  324683 0.98249677 
# 3: Afghanistan 1963  328135 0.97216085 
# 4:  Albania 1961  323603 0.01422422 
# 5:  Albania 1962  324683 0.01750323 
# 6:  Albania 1963  328135 0.02783915 
+2

Länder scheinen nicht mehrere Einträge pro Jahr zu haben, so dass Sie die Summe im zweiten Schritt nicht benötigen würden. 'd [,. (Land, frac = totalprod/sum (totalprod)), bis = Jahr]' oder so. Ich schätze auch, dass Sie zwischen den ersten beiden Zeilen ein bisschen früh dran sind. – Frank

+0

Das funktioniert, danke. – thiagoveloso

+2

@Frank Ich habe die Daten nicht genau untersucht. Versucht, einen sichereren Weg zur Lösung des Problems vorzuschlagen, falls es mehrere Datensätze für das Land gibt. – Psidom

2

Dies ist eine Basislösung, die es durch die Schritte bricht, die Sie fordern.

xd <- xtabs(totalprod~ Year+Country, data=d) 

xd <- cbind(xd, yr.total=rowSums(xd)) 

str(xd) 
num [1:54, 1:3] 319000 319000 319000 380000 380000 337000 396000 402000 407000 366000 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : chr [1:54] "1961" "1962" "1963" "1964" ... 
    ..$ : chr [1:3] "Afghanistan" "Albania" "yr.total" 
xd[ , -3]/xd[,3] 
    Afghanistan  Albania 
1961 0.9857758 0.014224219 
1962 0.9824968 0.017503226 
1963 0.9721608 0.027839152 
1964 0.9789450 0.021055045 
#snipped table 
+0

Das funktioniert, danke. Das Ergebnis ist jedoch ein wenig umständlich, da 129 Länder in der Liste stehen, und sie in Spalten zu haben ist nicht sehr praktisch. – thiagoveloso

+1

Ich verstehe den Downvote nicht. Die Wahl des Data Rustling Paradigmas ist eher eine Frage der Präferenz als der Korrektheit. Es gibt immer 'as.data.frame.table', um eine" breite "Tabelle zu einem" langen "Datenrahmen zu machen. –

+0

Entschuldigung, ich muss es versehentlich auf meinem Handy berührt haben. Kannst du bitte einen kleinen Schnitt machen, damit ich wieder abstimmen kann? – thiagoveloso