2013-05-09 2 views
3

나는 변수 (연령, 성별)의 그룹별로 통계를 생성하기 위해 tapply, ave, ddply을 사용하려고 노력 해왔다. 위의 R 명령을 성공적으로 사용할 수 없었습니다.tapply 사용, Rff 벡터에 대한 ave 함수

library("ff") 
df <- as.ffdf(data.frame(a=c(1,1,1:3,1:5), b=c(10:1), c=(1:10))) 
tapply(df$a, df$b, length) 

내가 오류 메시지가

Error in as.vmode(value, vmode) : 
    argument "value" is missing, with no default 

또는

Error in byMean(df$b, df$a) : object 'index' not found 
+5

[예제 코드] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)를 제공해주십시오. – sgibb

+0

df <- as.ffdf (data.frame (a = c (1,1,1 : 3,1 : 5), b = c (10 : 1), c = (1:10))) tapply df $ a, df $ b, length) – askabra

+0

@sgibb, 편집 해 주셔서 감사합니다. 매우 새롭습니다. – askabra

답변

2

현재 패키지 FF에서 구현 ff_vectors에 대한 tapply 또는 AVE는 현재 없습니다입니다. 하지만 할 수있는 일은 ffbase의 기능을 사용하는 것입니다. 다음과 같이 쉽게 길이를 추출 할 수있는 binned_sum를 사용할 수의 당신의 간단한 집계 방법에 대한 몇 가지 큰 데이터 세트

require(ffbase) 
a <- ffrep.int(ff(1:100000), times=500) ## 50Mio records on disk - not in RAM 
b <- ffrandom(n=length(a), rfun = runif) 
c <- ffseq_len(length(a)) 
df <- ffdf(a = a, b = b, c = c) ## on disk 
dim(df) 

에 자세히 설명하겠습니다. binned_sum이 bin에 ff 요소 객체를 필요로한다는 것을 표시합니다.이 객체는 그림과 같이 as.character.ff를 수행하여 얻을 수 있습니다.

더 복잡한 집계의 경우 ffbase에서 ffdfdply를 사용할 수 있습니다. 내가 자주하는 일은이 같은 일부 data.table 제표와 결합이다 :

require(data.table) 
agg <- ffdfdply(df, split=df$groupbyfactor, FUN=function(x){ 
    x <- as.data.table(x) 
    result <- x[, list(b.mean = mean(b), b.median = median(b), b.length = length(b),  whatever = b[c == max(c)][1]), by = list(a)] 
    result <- as.data.frame(result) 
    result 
}) 
class(agg) 
aggg <- as.data.frame(agg) ## Puts the data in RAM! 

이 일부 데이터와 같은 기능을 적용 할 수있는 기반으로 분할 요소 그룹의 덩어리 RAM에 데이터를 저장합니다. 테이블 문은 데이터가 RAM에 있어야합니다. 함수를 적용한 모든 청크의 결과는 다음에 새로운 ffdf로 결합되어 더 이상 사용하거나 RAM에 허용되는 경우 RAM에 넣을 수 있습니다.

청크의 크기는 getOption ("ffbatchbytes")에 의해 제어됩니다. 따라서 RAM이 더 많은 경우 RAM의 각 청크에서 더 많은 데이터를 얻을 수 있으므로 더 좋습니다.

+0

고마워! 오류 : - 문 안양 $의 groupbyfactor에서 askabra

+0

모든 데이터는 디스크에 저장됩니다. 요인을 제외한 모든 vmode의 경우 가상 부분의 크기는 몇 Kb에 불과합니다. 요소의 경우 모든 요소 수준도 RAM에 저장되고 데이터는 디스크에 저장됩니다. 따라서 RAM에있는 모든 요소 수준에서로드 할 수 없다면 오류가 발생합니다. 이런 일이 발생하면 대부분 RAM에 다른 객체가있어서 문제가 발생하기 때문입니다. 이 예제에서는 100000 요소 수준이 오버플로의 원인이 될 것이라고 생각하지 않지만 r 세션 중에 RAM에있는 다른 것들을 생각합니다. – jwijffels

+0

정말 도움이되었습니다, 감사합니다! – askabra

관련 문제