根据使用 Dplyr 减少或增加数字来查找差异
Finding the differences depending if a number is decreased or increased with 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() 但没有将硬币的使用和收益分开。
我想不出 eloquent 解决方案,如有任何帮助,我们将不胜感激。
这是一种方法:
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
如果您想使用 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
> 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() 但没有将硬币的使用和收益分开。 我想不出 eloquent 解决方案,如有任何帮助,我们将不胜感激。
这是一种方法:
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
如果您想使用 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