计算列中值增加的次数

时间:2014-11-14 00:05:39

标签: r count

我在R中有一个看起来像这样的数据框:

person  purch_date   num_purchased
Alex    2011-01-01   6
Alex    2011-06-05   5
Alex    2012-03-04   6
Beth    2011-02-04   7
Beth    2012-05-21   8
Beth    2013-11-11   10
Candy   2007-08-09   3
Candy   2009-10-01   2
Candy   2013-12-02   2

我先用“人”排序,然后用“purch_date”排序。

我正在计算每个人发生“num_purchased”列的增加量。我知道代码来计算列的唯一值的数量或值的变化次数,但这不是我想要的,因为我只想知道值从一个日期到下一个日期增加了多少倍。理想情况下,输出看起来像:

person  num_increases
Alex    1
Beth    2
Candy   0

3 个答案:

答案 0 :(得分:2)

这是一个data.table方法,它只会给你带来的结果 增加> 0,即那些= 0将不列表。 FYR虽然

library(data.table)
setDT(df)  ## set your data frame as data table
df[, diff(num_purchased), by=person][V1>0, .N, by=person]
#    person N
# 1:   Alex 1
# 2:   Beth 2

编辑。

纳入@ Arun的评论。更紧凑,得到“0”计数。

df[, sum(diff(num_purchased) > 0), by=person]
#    person V1
# 1:   Alex  1
# 2:   Beth  2
# 3:  Candy  0

答案 1 :(得分:1)

如果你想要一个矢量,你可以使用tapplydf是您的原始数据。

foo <- function(x) sum(diff(x) > 0)

with(df, tapply(num_purchased, person, foo))
# Alex  Beth Candy 
#    1     2     0 

或使用dplyr并仍使用foo

library(dplyr)
group_by(df, person) %>% summarize(increases = foo(num_purchased))
#   person increases
# 1   Alex         1
# 2   Beth         2
# 3  Candy         0

答案 2 :(得分:1)

您可以使用aggregate

在1-liner中获得所需格式的数据
aggregate(num_purchased~person, data=dat, function(x) sum(diff(x) > 0))
#   person num_purchased
# 1   Alex             1
# 2   Beth             2
# 3  Candy             0

如果你更喜欢输出的命名向量,我会建议tapply,如Richard Scriven的回答所述。