用R数据框中的条件进行计数

时间:2019-12-05 23:07:30

标签: r dataframe count conditional-statements

我有以下DF:

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
cd /home/ec2-user/
java -Xmx1900M -Xms1900M -jar server.jar nogui
--//

我希望得到这样的结果:

    Week   SKU   Discount(%)
     1     111       5
     2     111       5
     3     111       0
     4     111      10
     1     222       0
     2     222      10
     3     222      15
     4     222      20
     1     333       5
     2     333       0
     3     333       0

持续时间是1个SKU连续打折的周数。 LastDiscount会计算从SKU上一次连续打折起算的周数,仅当打折之间的周数为0时。

1 个答案:

答案 0 :(得分:0)

检查“持续时间”的一种方法是按“ SKU”分组后,对逻辑向量使用rle(游程长度编码),获取lengths和'values'和{ {1}}将这些持续时间相联系。类似地,可以通过获取rep的逻辑值来获得“ LastDiscount”

sum

或使用library(dplyr) df1 %>% group_by(SKU) %>% mutate(Duration = with(rle(Discount > 0), rep(lengths*values, lengths)), temp = with(rle(Discount > 0), sum(values != 0)), LastDiscount = if(temp[1] > 1) c(rep(0, n()-1), temp[1]) else 0) %>% select(-temp) # A tibble: 11 x 5 # Groups: SKU [3] # Week SKU Discount Duration LastDiscount # <int> <int> <int> <int> <dbl> # 1 1 111 5 2 0 # 2 2 111 5 2 0 # 3 3 111 0 0 0 # 4 4 111 10 1 2 # 5 1 222 0 0 0 # 6 2 222 10 3 0 # 7 3 222 15 3 0 # 8 4 222 20 3 0 # 9 1 333 5 1 0 #10 2 333 0 0 0 #11 3 333 0 0 0

data.table

数据

library(data.table)
i1 <- setDT(df1)[, grp := rleid(Discount > 0), SKU][Discount > 0,
  Duration := .N,  .(grp, SKU)][, 
   LastDiscount := uniqueN(grp[Discount > 0]), .(SKU)][, 
   tail(.I[Discount > 0 & LastDiscount > 1], 1), SKU]$V1
df1[-i1, LastDiscount := 0][]