我有一个复杂的计算需要完成。它基本上处于行级,我不知道如何解决这个问题。
如果你可以帮我解决方法或任何功能,那将非常棒。
为简单起见,我会将问题分解为两个子问题。
以下是我的数据的样子
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
我在每月级别有每个组的数据。
我想抓住以下两件事。
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中的行级捕获东西。我不是在寻找任何解决方案。只是寻找解决这个问题的第一步。非常感谢任何线索。
答案 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 = ",")