3

Entschuldigung, wenn diese Frage bereits beantwortet wurde, aber ich habe es nicht gefunden. Ich werde alle meine Ideen veröffentlichen, um es zu lösen. Das Problem ist, dass die Datenbank groß ist und mein PC diese Berechnung nicht durchführen kann (Core i7 und 8 GB RAM). Ich verwende Microsoft R Open 3.3.2 und RStudio 1.0.136.Erstellen Sie Spalte in R in einer großen Datenbank

Ich habe versucht, eine neue Spalte in einer großen Datenbank in R namens tcm.RData (471 MB) zu erstellen. Mein Bedarf ist eine Spalte, die Shape_Area durch die Summe von Shape_Area durch COD (die ich ShapeSum nannte) teilt. Ich versuchte zuerst, es in einer einzigen Formel zu tun, aber als es fehlschlug, versuchte ich es erneut in zwei Schritten mit 1) summiere Shape_Area durch COD und, wenn das gelingt, Shape_Area durch ShapeSum zu teilen.

> str(tcm) 
    Classes ‘data.table’ and 'data.frame': 26835293 obs. of 15 variables: 
    $ OBJECTID : int 1 2 3 4 5 6 7 8 9 10 ... 
    $ LAT  : num -15.7 -15.7 -15.7 -15.7 -15.7 ... 
    $ LONG  : num -58.1 -58.1 -58.1 -58.1 -58.1 ... 
    $ UF  : chr "MT" "MT" "MT" "MT" ... 
    $ COD  : num 510562 510562 510562 510562 510562 ... 
    $ AREA_97 : num 1130 1130 1130 1130 1130 ... 
    $ Shape_Area: num 255266.7 14875 25182.2 5503.9 95.5 ... 
    $ TYPE  : chr "2" "2" "2" "2" ... 
    $ Nomes  : chr NA NA NA NA ... 
    $ NEAR_DIST : num 376104 371332 371410 371592 371330 ... 
    $ tc_2004 : chr "AREA_URBANA" "DESFLORESTAMENTO_2004" "DESFLORESTAMENTO_2004" "DESFLORESTAMENTO_2004" ... 
    $ tc_2008 : chr "AREA_URBANA" "AREA_NAO_OBSERVADA" "AREA_NAO_OBSERVADA" "AREA_NAO_OBSERVADA" ... 
    $ tc_2010 : chr "AREA_URBANA" "PASTO_LIMPO" "PASTO_LIMPO" "PASTO_LIMPO" ... 
    $ tc_2012 : chr "AREA_URBANA" "PASTO_SUJO" "PASTO_SUJO" "PASTO_SUJO" ... 
    $ tc_2014 : chr "AREA_URBANA" "PASTO_LIMPO" "PASTO_LIMPO" "PASTO_SUJO" ... 
    - attr(*, ".internal.selfref")=<externalptr> 

> tcm$ShapeSum <- tcm[, Shape_Area := sum(tcm$Shape_Area), by="COD"] 
    Error: cannot allocate vector of size 204.7 Mb 
    Error during wrapup: cannot allocate vector of size 542.3 Mb 

Ich habe auch versucht die folgenden Codes, aber alle von ihnen schlug fehl:

> tcm$ShapeSum <- apply(tcm[, c(Shape_Area)], 1, function(x) sum(x), by="COD") 

Error in apply(tcm[, c(Shape_Area)], 1, function(x) sum(x), by = "COD") : dim(X) must have a positive lenght

> tcm$ShapeSum <- mutate(tcm, ShapeSum = sum(Shape_Area), by="COD", package = "dplyr") 

Error: cannot allocate vector of size 204.7 Mb Error during wrapup: cannot allocate vector of size 542.3 Mb

> tcm$ShapeSum <- tcm[, transform(tcm, ShapeSum = sum(Shape_Area)), by="COD"] 

> tcm$ShapeSum <- transform(tcm, aggregate(tcm$AreaShape, by=list(Category=tcm$COD), FUN=sum)) 

Error in aggregate.data.frame(as.data.frame(x), ...): no rows to aggregate

ich für Aufmerksamkeit sehr viel danken und für irgendeinen Vorschlag Maßnahmen, um dieses Problem zu lösen.

+0

Da es eine data.table ist, ist es besser, 'data.table' Methoden zu verwenden, dh. 'tcm [, ShapeSum: = Summe (Shape_Area), von = COD]' – akrun

Antwort

2

Wir haben die data.table Methoden für die Erstellung der Spalte verwenden können, wie sie effizienter mit der Zuordnung (:=), die Platz geschieht in

library(data.table) 
tcm[, ShapeSum := sum(Shape_Area), by = COD] 

oder als @ user20650 schlug vor, dass es (basierend auf der OP-Beschreibung)

tcm[, ShapeSum := Shape_Area/sum(Shape_Area), by = COD] 
sein könnte
+1

@ user20650 Ja, danke, dass es der Fall sein könnte. Ich habe die Beschreibung nicht vollständig gelesen – akrun

+0

Vielen Dank akrun und @ user20650. Leider bleibt der Speicherfehler bestehen: '> library (data.table)' '> laden ("tcm.RData")' '> tcm $ ShapeWeight <- tcm [, ShapeWeight: = Shape_Area/Summe (Shape_Area), von = COD] ' '> tcm $ ShapeWeight <- tcm [, FormGewicht: = Shape_Area/Summe (Shape_Area), von = COD] ' _Error: kann Vektor der Größe 204.7 nicht zuordnen Mb_ _Error während der Nachbearbeitung: Vektor der Größe kann nicht zugeordnet werden 634,2 MB_ > gc() ' verwendet (Mb) gc-Trigger (Mb) max (Mb) Ncells 407.961 21,8 750.400 40,1 750.400 40,1 Vcells verwendet 416623404 3178,6 1240807029 9466,7 1060617477 8091,9 – dfamaral

+0

ich bin nicht sicher, warum Sie tun, ' tcm $ ShapeWeight <-', da die 'ShapeWeight' Spalte mit': = ' – akrun

Verwandte Themen