2017-03-10 2 views
0

그래서 모든 행이 특정 이벤트의 주어진 사용자를 나타내는 테이블이 있습니다. 각 행에는 두 가지 유형의 정보가 포함됩니다. 이러한 이벤트의 결과뿐만 아니라 사용자에 관한 데이터입니다. 여러 사용자가 동일한 이벤트에 참여할 수 있습니다.R에서 이전 행의 롤링 평균을 사용하여 테이블을 업데이트 하시겠습니까?

EventID  Date Revenue Time(s) UserID  X  Y Z 
     1 1/1/2017  $10  120  1  3  2 2 
     1 1/1/2017  $15  150  2  2  1 2 
     2 2/1/2017  $50  60  1  1  5 1 
     2 2/1/2017  $45  100  4  3  5 2 
     3 3/1/2017  $25  75  1  2  3 1 
     3 3/1/2017  $20  210  2  5  5 1 
     3 3/1/2017  $25  120  3  1  0 4 
     3 3/1/2017  $15  100  4  3  1 1 
     4 4/1/2017  $75  25  4  0  2 1 

내 목표는 (이 예는 X, Y 및 Z 속성에) 특정 사용자의 성능 기록을 제공 할 수있는 모델을 구축하는 것입니다 : 명확성을 위해

, 여기에 같은 테이블의 간단한 예입니다 이벤트에 대한 주어진 수익 및 시간을 예측합니다.

지금부터는 그러한 모델을 훈련하고 테스트하기 위해 데이터를 포맷하는 방법이 있습니다. 더 구체적으로 말하자면 각 행이 이전 이벤트까지 각 사용자 속성의 이동 평균을 제시하면서 이벤트 별 정보를 유지하는 방식으로 테이블을 변환하려고합니다. 생각 프로세스의 예는 이벤트가 X, Y 및 Z 속성에서 평균 2, 3.5 및 1.5를 나타낼 때까지 의 사용자가 될 수 있으며 이러한 이벤트의 수익 및 시간 결과는 현재 25 달러 및 75 달러였습니다 나는 이것을 훈련을위한 인풋으로 사용할 것이다.

다시 한번 명확하게하기 위해, 여기에 내가 원래 테이블에 같은 논리를 적용 기대할 수있는 출력의 예입니다

:

EventID  Date Revenue Time(s) UserID  X  Y Z 
     1 1/1/2017  $10  120  1  0  0 0 
     1 1/1/2017  $15  150  2  0  0 0 
     2 2/1/2017  $50  60  1  3  2 2 
     2 2/1/2017  $45  100  4  0  0 0 
     3 3/1/2017  $25  75  1  2 3.5 1.5 
     3 3/1/2017  $20  210  2  2  1 2 
     3 3/1/2017  $25  120  3  0  0 0 
     3 3/1/2017  $15  100  4  3  5 2 
     4 4/1/2017  $75  25  4  3  3 1.5 

우리가 아직 알고 있기 때문에 각 사용자가 첫 등장에 모든 속성은 0입니다 통지 것을 그들에 대해서는 아무것도. 또한 사용자의 두 번째 모습에서 우리가 아는 것은 모두 그의 첫 등장의 결과입니다. 5 번과 9 번 줄에서는 사용자 1과 4의 세 번째 모습이 이전 공연의 롤링 평균을 보여주기 시작합니다.

한 명의 사용자 만 다루는 경우 해당 속성의 이동 평균을 계산 한 다음 속성 열의 데이터 만 한 행 아래로 이동하면이 문제를 해결할 수 있습니다. 내 질문은 다음과 같습니다.

  • 여러 명의 사용자가있는 테이블을 처리 할 때 사용자 ID별로 필터링 된 이러한 시프트를 수행하는 방법이 있습니까?
  • 또는 항상 각 사용자의 다음 모양에 결과를 배치하여 원본 테이블에서 직접 롤링 평균을 계산하는 더 나은 방법이 있습니까?

모든 행이 이미 날짜순으로 정렬되어 있다고 가정 할 수 있습니다. 이 문제와 관련된 다른 팁이나 참조도 환영합니다.

또한 하나의 라이너 제목으로 내 질문을 요약하는 방법이 명확하지 않았기 때문에이를 개선하는 방법을 생각해 볼 수있는 R 전문가의 제안에 대해 공개하고 있습니다.

답변

1

dplyr 패키지를 사용하여 원하는 출력을 얻을 수 있습니다.

library(dplyr) 

tablinka %>% 
     arrange(UserID, EventID) %>% 
     group_by(UserID) %>% 
     mutate_at(c("X", "Y", "Z"), cummean) %>% 
     mutate_at(c("X", "Y", "Z"), lag) %>% 
     mutate_at(c("X", "Y", "Z"), funs(ifelse(is.na(.), 0, .))) %>% 
     arrange(EventID, UserID) %>% 
     ungroup() 

당사의 데이터 군을 배치하고, 원하는 변환 적용합니다 (dplyr 기능 cummean, lag, 0은 ifelse를 이용하여 NA 교체).

일단 완료되면 데이터를 원래 상태로 다시 정렬하고 그룹을 해제합니다.

+0

정확히 내가 뭘했는지, 도와 주셔서 감사합니다 @JuanBosco! – htaunay

관련 문제