2013-09-06 2 views
1

각 분기에 대해 가장 빠르게 성장하는 5 가지 항목을 파악하려고합니다. 나는 3 열 - 분기 수 (df $ QNum), 주제 (df $ Topic) 및 그 분기의 레코드 수 (df $ Total_Hits)와 함께 R에서 데이터 프레임 (df라고 부름)을 갖습니다.R : 데이터 프레임에 여러 변수가있는 "성장"열을 계산하는 방법

Total_Hits   Topic     QNum 
     10    Technology   1 
     86    Video Conferencing 1 
     14    Video Conferencing 2 
     10    Technology   3 
     1    Video Conferencing 1 
     12    Technology   21 

나는 안양에 새 열을 만들려면, DF $ QonQGrowth는 각 레코드에 대해, 오버 그 주제에 조회수의 성장을 계산하는 것이 : 여기

내 dataframe 안양 보이는 방법의 예 전 분기. df $ QNum = 1을 찾는 방법은 마음에 들지 않지만이 예제의 세 번째 레코드는 다음과 같이 계산됩니다. (Total_Hits/(Total_Hits, 여기서 Topic = "화상 회의"및 QNum = 1) -1)

나는 그것이 같을 것이라고 생각 다음하지만 확실히 그것을 알아낼 수 없습니다

df$QonQGrowth <- (df$Total_Hits/([a lookup of Total_Hits for df$Topic and (df$Qnum-1)?]))-1 

데이터 세트가 모든 항목을 매 분기에 대한 레코드가되지 않을 수 그래서 꽤 크다 .

비슷한 질문 herehere하지만 그들은 내가 원하는 것을 정확하게 수행하지 않습니다.

편집 : This question ddply 또는 aggregate를 사용하면 유용 할 수도 있습니다.

미리 감사드립니다.

답변

4

나는이 작업을 수행 할 수있는 깨끗한 방법이 확신 해요,하지만 여기 못생긴 plyr 솔루션입니다 :

> #make junk data 
> set.seed(3) 
> dat <- data.frame(total_hits=round(runif(25,0,50)),topic=sample(c("A","B","C","D"),25,T),qnum=round(runif(25,1,6))) 
> dat <- dat[row.names(unique(dat[,2:3])),] 
> dat 
    total_hits topic qnum 
1   8  D 2 
2   40  C 2 
3   19  D 5 
4   16  C 6 
6   30  B 6 
7   6  B 3 
8   15  A 2 
9   29  B 2 
11   26  B 5 
12   25  D 1 
13   27  A 5 
18   35  A 4 
19   45  C 3 
20   14  B 1 
23   6  A 6 
25   12  D 4 
> 
> #get you qonqgrowth variable 
> library(plyr) 
> ddply(dat,.(topic,qnum),summarize,qonqgrowth=ifelse(any(dat$qnum==qnum-1 & dat$topic == topic),total_hits/(dat$total_hits[dat$qnum == qnum-1 & dat$topic == topic]),NA)) 
    topic qnum qonqgrowth 
1  A 2   NA 
2  A 4   NA 
3  A 5 0.7714286 
4  A 6 0.2222222 
5  B 1   NA 
6  B 2 2.0714286 
7  B 3 0.2068966 
8  B 5   NA 
9  B 6 1.1538462 
10  C 2   NA 
11  C 3 1.1250000 
12  C 6   NA 
13  D 1   NA 
14  D 2 0.3200000 
15  D 4   NA 
16  D 5 1.5833333 
+0

어쩌면 복잡하지만, 모든 추한하지 :-). –

+0

정확히 내가 원했던 것, 감사합니다. 불행하게도 너무 커서 제 데이터 세트에서 작동하지 않습니다. (그러나 ddply를 사용할 수있는 방법을 확인하는 것이 좋습니다.) – jegeragh

+0

오류 메시지가 표시됩니다. 여러 개의 코어와 충분한 메모리가 있지만 data.table 솔루션이 더 좋은 옵션 일 수 있다면 쉽게 병렬로 모든 ddply를 실행할 수 있습니다. – David

관련 문제