R中行级连续零的复杂数据计算(滞后v / s导联)

时间:2018-06-07 17:20:27

标签: r

我有一个复杂的计算需要完成。它基本上处于行级,我不知道如何解决这个问题。

如果你可以帮我解决方法或任何功能,那将非常棒。

为简单起见,我会将问题分解为两个子问题。

以下是我的数据的样子

Group,Date,Month,Sales,lag7,lag6,lag5,lag4,lag3,lag2,lag1,lag0(reference),lead1,lead2,lead3,lead4,lead5,lead6,lead7
Group1,42005,1,2503,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1
Group1,42036,2,3734,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0
Group1,42064,3,6631,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0
Group1,42095,4,8606,0,1,0,1,1,0,1,0,1,1,1,0,0,0,0
Group1,42125,5,1889,0,1,1,0,1,0,0,0,0,0,0,0,1,1,0
Group1,42156,6,4819,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0
Group1,42186,7,5120,0,0,1,1,1,1,1,0,0,1,1,0,1,1,0

enter image description here

我在每月级别有每个组的数据。

我想抓住以下两件事。

1。每行来自lag0(参考)的连续零的计数

突出显示的黄色是连续的滞后0(参考)到某一点的情况,它达到第一个1.我想捕获行级别的零点数,以及相应的销售值。

以下是我正在寻找part1的输出。

输出:

Month,Sales,Count
1,2503,9
2,3734,3
3,6631,5
4,8606,0
5,1889,6
6,4819,1
7,5120,1

2。识别连续的行(行:1,2和3以及类似的行:5,6),其中任何滞后或超前的重叠发生在lag0(参考范围)内的任何0,并捕获它们的销售和月份值。

例如,对于第1,2和3行,重叠发生在至少滞后:3,2,1& 导联:1,2,需要捕获并标记为case1(或1)。类似地,对于第5行和第6行,至少lag1是重叠的,因此需要捕获它,并将其标记为Case2(或2)以及Sales和Month值。

现在,第7行与前一个或后一个连续的行没有重叠,因此不会被捕获。

以下是我正在寻找第2部分的结果。

Month,Sales,Case
1,2503,1
2,3734,1
3,6631,1
5,1889,2
6,4819,2

我想为多个组运行它,因此我将合并dplyr或loop来获得结果。目前,我只是在寻找这种方法。

不确定如何解决这个问题。我第一次想要在R中的行级捕获东西。我不是在寻找任何解决方案。只是寻找解决这个问题的第一步。非常感谢任何线索。

1 个答案:

答案 0 :(得分:1)

使用rle进行计算的第一部分的选项可以是:

df$count <- apply(df[,-c(1:4)],1,function(x){
  first <- rle(x[1:7])
  second <- rle(x[9:15])
  count <- 0
  if(first$values[length(first$values)] == 0){
    count = first$lengths[length(first$values)]
  }
  if(second$values[1] == 0){
    count = count+second$lengths[1]
  }
  count

})

df[,c("Month", "Sales", "count")]
  # Month Sales count
# 1     1  2503     9
# 2     2  3734     3
# 3     3  6631     5
# 4     4  8606     0
# 5     5  1889     6
# 6     6  4819     1
# 7     7  5120     1

数据:

df <- read.table(text = 
"Group,Date,Month,Sales,lag7,lag6,lag5,lag4,lag3,lag2,lag1,lag0(reference),lead1,lead2,lead3,lead4,lead5,lead6,lead7
Group1,42005,1,2503,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1
Group1,42036,2,3734,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0
Group1,42064,3,6631,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0
Group1,42095,4,8606,0,1,0,1,1,0,1,0,1,1,1,0,0,0,0
Group1,42125,5,1889,0,1,1,0,1,0,0,0,0,0,0,0,1,1,0
Group1,42156,6,4819,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0
Group1,42186,7,5120,0,0,1,1,1,1,1,0,0,1,1,0,1,1,0",
header = TRUE, stringsAsFactors = FALSE, sep = ",")