我在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
答案 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)
如果你想要一个矢量,你可以使用tapply
。 df
是您的原始数据。
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
:
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的回答所述。