我有一个数据框:
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
答案 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