根据Dplyr减少或增加数量,找出差异

时间:2015-01-16 06:32:55

标签: r dplyr

> 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获得和获得的硬币总和。

预期结果:

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

我尝试使用lag(),但没有将硬币的使用和收益分开。 我无法想到一个雄辩的解决方案,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

如果您想使用data.table进行探索,这是一种方法。在这里,我使用与@docendo discimus类似的策略,并使用shiftdata.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