2013-07-13 2 views
0

큰 형식의 반복 측정 값 (41764 관측치)이 있습니다. 나는 데이터 프레임을 요약하고 각기 다른 개인에 대해 단일 값을 가진 새로운 데이터 프레임을 만들려고 노력하고있다 (총 3112 개의 관측). 나는 ddply 요약을 사용하고 있는데, 나의 특별한 경우에 대한 배경은 New dataframe with difference between first and last values of repeated measurements?이다. 이 코드ddply 요약 메모리 부족 실행

df2 <- ddply(df1, .(indv), summarize, df1['value1'], df1['value2']) 

를 사용하고 있지만이를 실행할 때, 나는이 오류

Error: cannot allocate vector of size 991.6 Mb 
In addition: Warning messages: 
1: In output[[var]][rng] <- df[[var]] : 
Reached total allocation of 8088Mb: see help(memory.size) 
2: In output[[var]][rng] <- df[[var]] : 
Reached total allocation of 8088Mb: see help(memory.size) 
3: In output[[var]][rng] <- df[[var]] : 
Reached total allocation of 8088Mb: see help(memory.size) 
4: In output[[var]][rng] <- df[[var]] : 
Reached total allocation of 8088Mb: see help(memory.size) 

을 얻을

나는이 문제를 해결하는 방법을하지 확신합니다. 나는 메모리 상주하는 모든 데이터 프레임을 파일로 저장하고, R을 닫은 다음 R로 다시 가져 오는 것을 시도했다. 이것은 적어도 초기에는 메모리를 절약하는 것처럼 보이지만, ddply를 실행하면 RAM이 여전히 부족하다.

나는이 기계에 8GB의 RAM을 가지고 있으며이 모든 것을 R에 사용할 수 있습니다. 누구든지이 문제를 해결하기 위해 무엇을 할 수 있는지 알고 있습니까?

아마 내가 ddply 요약을 사용해서는 안되며, 아마 이것을 할 수있는 더 좋은 방법이 있을까요?

편집 : 명령을 잘못 발행 한 것 같습니다.

df2 <- ddply(df1, .(indv), summarize, value1=(tail(value1, 1)), value2=(tail(value2, 1)), group=(tail(group, 1))) 

과 같은 명령은 내가 찾고있는 결과를주는 것처럼 보입니다.

+2

다음 단계는 무엇입니까? 이 작업을 수행하지 않아도됩니다. –

+1

안녕하세요 LostBrit, 귀하의 의견에 감사드립니다. 내가 궁극적으로 원하는 것은 value1과 value2의 평균과 SEM을 계산하는 것입니다. 다른 그룹의 individualuaols "indv"에 대한 것입니다. 따라서 기본적으로 value1과 value2의 마지막 인스턴스를 내 데이터 프레임에서 가져 와서 새로운 데이터 프레임을 만들려고합니다. 아마도 이것과 비슷한 것이 더 필요합니다 : df2 <- ddply (df1,. (indv), summarize, tail (value1, 1), tail (value2, 1), tail (group, 1)) – Thomas

+0

plyr 정말 많은 수의 레벨을 잘 처리합니다. 기저귀 R에서 최선을 다 할 수 있습니다. –

답변

1

좋아요, LostBrit의 도움 덕분에, 제가 잘못 명령을 내고 있다는 것을 깨닫게되었습니다 (또는 처음에 정확히 무엇을하려했는지에 대해 분명히 알지 못합니다). 이 코드는 내가 원하는 결과를 제공하는 것 같습니다 :

df2 <- ddply(df1, .(indv), summarize, 
     value1=tail(value1, 1), 
     value2=tail(value2, 1), 
     group =tail(group, 1)) 

도움을 주신 모든 분들께 감사드립니다!