R-如何同时使用diff()和分组?

R-如何同时使用diff()和分组?,r,R,我有一个带值的数据框 cust_no name trans_date amount 1122 abc 2014-03-10 2000 1122 abc 2014-03-15 300 4444 pqr 2014-01-10 1000 4444 pqr 2014-01-15 1000 4444 pqr 2014-02-15 1000 7777 xyz 2014-0

我有一个带值的数据框

cust_no name    trans_date     amount
1122    abc     2014-03-10     2000
1122    abc     2014-03-15     300
4444    pqr     2014-01-10     1000
4444    pqr     2014-01-15     1000
4444    pqr     2014-02-15     1000
7777    xyz     2014-01-10     34
7777    xyz     2014-01-11     444
7777    xyz     2014-01-17     2344
7777    xyz     2014-01-30     345
我希望为同一客户计算两笔交易之间的天数差。我的输出应该是

cust_no name  trans_date       amount TimeDiff    
1122     abc 2014-03-10         2000  0
1122     abc 2014-03-15         300   5
4444     pqr 2014-01-10         1000  0
4444     pqr 2014-01-15         1000  5
4444     pqr 2014-02-15         1000  30
7777     xyz 2014-01-10         34    0
7777     xyz 2014-01-11         444   1
7777     xyz 2014-01-17         2344  6
7777     xyz 2014-01-30         345   13
我尝试了以下代码(当然没有使用
diff()


您可以使用
ave
或包
dplyr
data.table
按组计算

数据

df <- structure(list(cust_no = c(1122L, 1122L, 4444L, 4444L, 4444L, 
7777L, 7777L, 7777L, 7777L), name = structure(c(1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L), .Label = c("abc", "pqr", "xyz"), class = "factor"), 
    trans_date = structure(c(16139, 16144, 16080, 16085, 16116, 
    16080, 16081, 16087, 16100), class = "Date"), amount = c(2000L, 
    300L, 1000L, 1000L, 1000L, 34L, 444L, 2344L, 345L)), .Names = c("cust_no", 
"name", "trans_date", "amount"), row.names = c(NA, -9L), class = "data.frame")
data.table解决方案

require(dplyr)
df %>% group_by(cust_no) %>% mutate(time_diff = c(0, diff(trans_date)))
require(data.table)
setDT(df)[, time_diff :=c(0, diff(trans_date)), by=cust_no][]

您可以使用
ave
或包
dplyr
data.table
按组计算

数据

df <- structure(list(cust_no = c(1122L, 1122L, 4444L, 4444L, 4444L, 
7777L, 7777L, 7777L, 7777L), name = structure(c(1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L), .Label = c("abc", "pqr", "xyz"), class = "factor"), 
    trans_date = structure(c(16139, 16144, 16080, 16085, 16116, 
    16080, 16081, 16087, 16100), class = "Date"), amount = c(2000L, 
    300L, 1000L, 1000L, 1000L, 34L, 444L, 2344L, 345L)), .Names = c("cust_no", 
"name", "trans_date", "amount"), row.names = c(NA, -9L), class = "data.frame")
data.table解决方案

require(dplyr)
df %>% group_by(cust_no) %>% mutate(time_diff = c(0, diff(trans_date)))
require(data.table)
setDT(df)[, time_diff :=c(0, diff(trans_date)), by=cust_no][]

您可以使用
ave
或包
dplyr
data.table
按组计算

数据

df <- structure(list(cust_no = c(1122L, 1122L, 4444L, 4444L, 4444L, 
7777L, 7777L, 7777L, 7777L), name = structure(c(1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L), .Label = c("abc", "pqr", "xyz"), class = "factor"), 
    trans_date = structure(c(16139, 16144, 16080, 16085, 16116, 
    16080, 16081, 16087, 16100), class = "Date"), amount = c(2000L, 
    300L, 1000L, 1000L, 1000L, 34L, 444L, 2344L, 345L)), .Names = c("cust_no", 
"name", "trans_date", "amount"), row.names = c(NA, -9L), class = "data.frame")
data.table解决方案

require(dplyr)
df %>% group_by(cust_no) %>% mutate(time_diff = c(0, diff(trans_date)))
require(data.table)
setDT(df)[, time_diff :=c(0, diff(trans_date)), by=cust_no][]

您可以使用
ave
或包
dplyr
data.table
按组计算

数据

df <- structure(list(cust_no = c(1122L, 1122L, 4444L, 4444L, 4444L, 
7777L, 7777L, 7777L, 7777L), name = structure(c(1L, 1L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L), .Label = c("abc", "pqr", "xyz"), class = "factor"), 
    trans_date = structure(c(16139, 16144, 16080, 16085, 16116, 
    16080, 16081, 16087, 16100), class = "Date"), amount = c(2000L, 
    300L, 1000L, 1000L, 1000L, 34L, 444L, 2344L, 345L)), .Names = c("cust_no", 
"name", "trans_date", "amount"), row.names = c(NA, -9L), class = "data.frame")
data.table解决方案

require(dplyr)
df %>% group_by(cust_no) %>% mutate(time_diff = c(0, diff(trans_date)))
require(data.table)
setDT(df)[, time_diff :=c(0, diff(trans_date)), by=cust_no][]



哪一列提到了客户?抱歉。我编辑的问题的列名
transaction\u date
与所需输入不匹配,并且output@DavidArenburg你的解决方案确实奏效了!!你为什么要删除它?请重新发布。因为@shadow发布了相同的解决方案,也添加了一个
dplyr
1,所以不需要在两个完全相同的解决方案中添加哪个列引用了客户?抱歉。我编辑的问题的列名
transaction\u date
与所需输入不匹配,并且output@DavidArenburg你的解决方案确实奏效了!!你为什么要删除它?请重新发布。因为@shadow发布了相同的解决方案,也添加了一个
dplyr
1,所以不需要在两个完全相同的解决方案中添加哪个列引用了客户?抱歉。我编辑的问题的列名
transaction\u date
与所需输入不匹配,并且output@DavidArenburg你的解决方案确实奏效了!!你为什么要删除它?请重新发布。因为@shadow发布了相同的解决方案,也添加了一个
dplyr
1,所以不需要在两个完全相同的解决方案中添加哪个列引用了客户?抱歉。我编辑的问题的列名
transaction\u date
与所需输入不匹配,并且output@DavidArenburg你的解决方案确实奏效了!!你为什么要删除它?请重新发布。因为@shadow发布了相同的解决方案,也添加了一个
dplyr
1,所以不需要两个完全相同的解决方案。对于没有提供列名,我深表歉意。我用专栏编辑了这个问题names@shadow您还可以在
ave
@shadow中包含base R选项。我使用的
df$TimeDIff@akrun实际上是因为我错误地使用了
ave
df$TimeDIff@sunitprasad1我想这是因为修改了不提供列名的策略而解决的。我用专栏编辑了这个问题names@shadow您还可以在
ave
@shadow中包含base R选项。我使用的
df$TimeDIff@akrun实际上是因为我错误地使用了
ave
df$TimeDIff@sunitprasad1我想这是因为修改了不提供列名的策略而解决的。我用专栏编辑了这个问题names@shadow您还可以在
ave
@shadow中包含base R选项。我使用的
df$TimeDIff@akrun实际上是因为我错误地使用了
ave
df$TimeDIff@sunitprasad1我想这是因为修改了不提供列名的策略而解决的。我用专栏编辑了这个问题names@shadow您还可以在
ave
@shadow中包含base R选项。我使用的
df$TimeDIff@akrun实际上是因为我错误地使用了
ave
<代码>df$TimeDIff@sunitprasad1我想它通过修改得到了解决