3

이 질문에 대한 답변이 이미 있지만 찾을 수 없으면 사과드립니다. 나는 그것을 해결하기 위해 내 모든 생각을 게시 할 것입니다. 문제는 데이터베이스가 크고 PC가이 계산을 수행 할 수 없다는 것입니다 (코어 i7 및 8GB RAM). Microsoft R Open 3.3.2 및 RStudio 1.0.136을 사용하고 있습니다.큰 데이터베이스에 R 열 작성

tcm.RData (471MB)라는 R의 대형 데이터베이스에 새 열을 만들려고했습니다. 필자의 필요성은 Shape_Area를 Shape_Area와 COD (ShapeSum이라고 함)의 합으로 나눈 기둥입니다. 처음에는 하나의 수식에서 처리하려고했지만 실패한 경우 다시 한 번 Shape_Area를 COD로 요약하고 Shape_Area를 ShapeSum으로 나눕니다.

> 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 

은 또한 다음과 같은 코드를 시도했지만 모두 실패 :

> 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") 
> 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

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

내가 관심과 대단히 감사합니다 어떤 찻잔 이 문제를 해결하기위한 제스처.

+0

data.table이므로'data.table' 메서드를 사용하는 것이 더 좋습니다. 'tcm [, ShapeSum : = sum (Shape_Area) by by COD]' – akrun

답변

2
제자리에서 일어나는 할당 ( :=) 더 효율적으로 우리는 열을 작성하기위한 data.table 방법을 사용할 수 있습니다

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

또는 @ user20650이 제안 할 수 있음 (OP의 설명에 기초)

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

@ user20650 네, 고마워요. 설명을 완전히 읽지 않았습니다 – akrun

+0

akrun 및 @ user20650 감사합니다. 'tcm.RData') ' '> tcm $ ShapeWeight <, ShapeWeight : = Shape_Area/sum (Shape_Area), by (tac.RData) = COD] '> TCM $ ShapeWeight <- [ShapeWeight TCM = Shape_Area/SUM (Shape_Area)'] = COD 의해 _ERROR : WRAPUP 동안 크기 204.7 Mb_ _ERROR 벡터를 할당 할 수있는 것은 : 크기 벡터를 할당 할 수없는 634.2 Mb_ '> GC()' 사용 (MB) GC 트리거 (MB) 최대 사용 (MB) n- 셀들 407,961 21.8 750,400 40.1 750,400 40.1 Vcells 416,623,404 3178.6 1240807029 9466.7 1060617477 8091.9 – dfamaral

+0

난 당신이'하고있는 이유는 확실하지 않다 tcm $ ShapeWeight'ShapeWeight' 컬럼은': = '을 사용하여 생성되었습니다. – akrun