如何获得数据帧中连续观察的总数

时间:2016-03-27 15:50:41

标签: r dataframe

我有一个数据框:

START_DATE  ITEM_ID SALE_PRICE
28-12-14    914602  0
04-01-15    914602  0
11-01-15    914602  0
18-01-15    914602  0
25-01-15    914602  2
01-02-15    914602  0
08-02-15    914602  0
15-02-15    914602  2
22-02-15    914602  2
01-03-15    914602  2
08-03-15    914602  0
15-03-15    914602  2
22-03-15    914602  2
29-03-15    914602  2
05-04-15    914602  2
12-04-15    914602  2
19-04-15    914602  2

我希望在销售价格发生变化时获得连续销售价格的总数 需要的输出是:

START_DATE  ITEM_ID SALE_PRICE  No_of_times
28-12-14    914602  0   4
25-01-15    914602  2   1
01-02-15    914602  0   2
15-02-15    914602  2   3
08-03-15    914602  0   1
15-03-15    914602  2   6

4 个答案:

答案 0 :(得分:4)

这里有" data.table"的可能性。您可能需要根据实际的分组变量/变量进行调整。如果您想更改列顺序,请在最后使用setcolorder,如果需要,您可以将rid列与rid := NULL一起删除。

library(data.table)
as.data.table(mydf)[, rid := rleid(SALE_PRICE)][
  , c(TIMES = .N[1], lapply(.SD, head, 1)), by = rid]
#    rid TIMES START_DATE ITEM_ID SALE_PRICE
# 1:   1     4   28-12-14  914602          0
# 2:   2     1   25-01-15  914602          2
# 3:   3     2   01-02-15  914602          0
# 4:   4     3   15-02-15  914602          2
# 5:   5     1   08-03-15  914602          0
# 6:   6     6   15-03-15  914602          2

在基础R中,您只需使用rle

x <- rle(mydf$SALE_PRICE)
cbind(mydf[cumsum(c(1, x$lengths[-length(x$lengths)])), ], TIMES = x$lengths)
##    START_DATE ITEM_ID SALE_PRICE TIMES
## 1    28-12-14  914602          0     4
## 5    25-01-15  914602          2     1
## 6    01-02-15  914602          0     2
## 8    15-02-15  914602          2     3
## 11   08-03-15  914602          0     1
## 12   15-03-15  914602          2     6

答案 1 :(得分:3)

您可以尝试:

ind<-which(c(TRUE,df$SALE_PRICE[-1]!=df$SALE_PRICE[-nrow(df)]))
cbind(df[ind,],No_of_items=diff(c(ind,nrow(df)+1)))
#   START_DATE ITEM_ID SALE_PRICE No_of_items
#1    28-12-14  914602          0           4
#5    25-01-15  914602          2           1
#6    01-02-15  914602          0           2
#8    15-02-15  914602          2           3
#11   08-03-15  914602          0           1
#12   15-03-15  914602          2           6

答案 2 :(得分:3)

您可以使用包rleid的函数data.table函数为连续相同的值创建分组ID。

所以,使用data.table我会这样做:

DT <- fread("START_DATE  ITEM_ID SALE_PRICE
28-12-14    914602  0
04-01-15    914602  0
11-01-15    914602  0
18-01-15    914602  0
25-01-15    914602  2
01-02-15    914602  0
08-02-15    914602  0
15-02-15    914602  2
22-02-15    914602  2
01-03-15    914602  2
08-03-15    914602  0
15-03-15    914602  2
22-03-15    914602  2
29-03-15    914602  2
05-04-15    914602  2
12-04-15    914602  2
19-04-15    914602  2")

DT[, No_of_time := length(ITEM_ID), by = rleid(SALE_PRICE)]
unique(DT, by = "No_of_time")
#>    START_DATE ITEM_ID SALE_PRICE No_of_time
#> 1:   28-12-14  914602          0          4
#> 2:   25-01-15  914602          2          1
#> 3:   01-02-15  914602          0          2
#> 4:   15-02-15  914602          2          3
#> 5:   15-03-15  914602          2          6

答案 3 :(得分:1)

以下是使用UserProfile

的选项
dplyr