2015-01-16 1 views
4
> df 
Date  User Current_Coins 
01/01  1  150 
01/02  1  100 
01/01  2  100 
01/02  2  150 
01/01  3  100 
01/02  3  150 
01/03  3  100 
01/04  3  200 
01/04  3  0 

Основываясь на том, сколько монет в настоящее время у пользователя есть, я хочу суммировать сумму монет, используемых и полученных с использованием dplyr.Поиск различий в зависимости от того, уменьшено или увеличено число с помощью Dplyr

Ожидаемый результат:

> df 
User Coins_Gained Coins_Used 
1   0    50 
2   50    0 
3   150    250 

Я попытался с помощью лаг(), но не разделяет использование и прибыль в монетах. Я не могу придумать красноречивого решения этой проблемы, любая помощь будет оценена.

ответ

6

Вот один из способов сделать это:

library(dplyr) 
df %>% 
    group_by(User) %>% 
    mutate(x = Current_Coins - lag(Current_Coins)) %>%  # compute the differences 
    summarise(Coin_gained = sum(x[x>0], na.rm = TRUE),  # sum up positives 
      Coin_used = abs(sum(x[x<0], na.rm = TRUE)))  # sum up negatives 

#Source: local data frame [3 x 3] 
# 
# User Coin_gained Coin_used 
#1 1   0  50 
#2 2   50   0 
#3 3   150  250 
3

Если вы хотите исследовать с помощью data.table, вот один из способов. Здесь я использую аналогичную стратегию, как @docendo discimus, и использовал shift (новая функция в data.table)

library(data.table) #data.table_1.9.5 
setDT(df)[,{tmp=Current_Coins-shift(Current_Coins) 
     list(Coins_gained=sum(tmp[tmp>0], na.rm=TRUE), 
     Coins_Used=abs(sum(tmp[tmp<0], na.rm=TRUE)))} , User] 
# User Coins_gained Coins_Used 
#1: 1   0   50 
#2: 2   50   0 
#3: 3   150  250 
Смежные вопросы