按R data.table中的后续出现次数标记行

按R data.table中的后续出现次数标记行,r,data.table,time-series,R,Data.table,Time Series,我是R方面的新手,我一直在努力解决一个我想在data.table中应用的条件 我的data.table按订单id和日期排序,如下所示 我需要的是创建一个新列,其中包含一个具有以下条件的flagger变量: 如果在小时数增量列中有超过3个连续的0,则用标志1标记这些行和之前的行 如果在小时增量中连续0少于3个且多于1个 然后用标志_2标记这些线和前面的线 如果两行索引[8]中大于0的两行之间只有一个0,则用标志_3标记这些行 用标志_4标记所有其余部分 这就是我希望表格在新列之后的样子 任何帮

我是R方面的新手,我一直在努力解决一个我想在data.table中应用的条件

我的data.table按订单id和日期排序,如下所示

我需要的是创建一个新列,其中包含一个具有以下条件的flagger变量:

  • 如果在小时数增量列中有超过3个连续的0,则用标志1标记这些行和之前的行

  • 如果在小时增量中连续0少于3个且多于1个 然后用标志_2标记这些线和前面的线

  • 如果两行索引[8]中大于0的两行之间只有一个0,则用标志_3标记这些行

  • 用标志_4标记所有其余部分

这就是我希望表格在新列之后的样子

任何帮助都将不胜感激


谢谢大家!

我认为这样的事情可能会对你想要完成的目标起作用

library(dplyr)

# Create test dataframe
index <- c(0:19)
Order_id <- c(rep(001,8),rep(002,3),rep(003,4),rep(004,3),rep(005,2))
hours_delta <- c(720,552,rep(0,5),432,0,72,96,121,0,0,0,33,0,0,77,0)

df <- data.frame(index,Order_id,hours_delta)


# Start dplyr modifications
df <- df %>%
      # Group data by Order_id
      group_by(Order_id) %>%
      # Get the number of repitions of 0 for in the hours_delta field for that Order_id
      mutate(rle = ifelse(hours_delta == 0,rle(hours_delta)[[1]][rle(hours_delta)[[2]] == 0],NA),
             # Set the row above a zero sequence to the number of repetitions
             rle = ifelse(is.na(rle),lead(rle),rle)) %>%
      # ungroup the data
      ungroup() %>%
      # Set the flags based on number of repetitions
      mutate(flagger = case_when(is.na(.$rle)
                                 ~ "flag_4",
                                 .$rle == 1
                                 ~ "flag_3",
                                 (.$rle <= 3 & .$rle > 1)
                                 ~ "flag_2",
                                 .$rle > 3
                                 ~ "flag_1"
                                )
             ) %>%
     # Remove the temporary rle column
     select(-rle)
库(dplyr)
#创建测试数据帧
指标3
~“标志1”
)
) %>%
#删除临时rle列
选择(-rle)

我想这样的事情可能会对你想要实现的目标起作用

library(dplyr)

# Create test dataframe
index <- c(0:19)
Order_id <- c(rep(001,8),rep(002,3),rep(003,4),rep(004,3),rep(005,2))
hours_delta <- c(720,552,rep(0,5),432,0,72,96,121,0,0,0,33,0,0,77,0)

df <- data.frame(index,Order_id,hours_delta)


# Start dplyr modifications
df <- df %>%
      # Group data by Order_id
      group_by(Order_id) %>%
      # Get the number of repitions of 0 for in the hours_delta field for that Order_id
      mutate(rle = ifelse(hours_delta == 0,rle(hours_delta)[[1]][rle(hours_delta)[[2]] == 0],NA),
             # Set the row above a zero sequence to the number of repetitions
             rle = ifelse(is.na(rle),lead(rle),rle)) %>%
      # ungroup the data
      ungroup() %>%
      # Set the flags based on number of repetitions
      mutate(flagger = case_when(is.na(.$rle)
                                 ~ "flag_4",
                                 .$rle == 1
                                 ~ "flag_3",
                                 (.$rle <= 3 & .$rle > 1)
                                 ~ "flag_2",
                                 .$rle > 3
                                 ~ "flag_1"
                                )
             ) %>%
     # Remove the temporary rle column
     select(-rle)
库(dplyr)
#创建测试数据帧
指标3
~“标志1”
)
) %>%
#删除临时rle列
选择(-rle)

马特·杰维特(Matt Jewett)的反应真是太好了!谢谢你的回答。这个答案是对@oikonang上面的评论的回应,他正确地注意到,如果存在相同顺序的连续0组,则此解决方案不起作用

要解决这个问题,这里有一些基本代码,可以包含在上面@Matt Jewett的代码中:

rle = unlist(sapply(1:length(rle(hours_delta)[[1]]), function(r) {
  if (rle(hours_delta)[[2]][r] == 0) {
     rep(rle(hours_delta)[[1]][r],rle(hours_delta)[[1]][r]) 
  } else {
  rep(NA, rle(hours_delta)[[1]][r]) }
}))
应将其包括在内,以代替

ifelse(hours_delta == 0,rle(hours_delta)[[1]][rle(hours_delta)[[2]] == 0],NA)

上面一行。

马特·杰维特的回应真是太好了!谢谢你的回答。这个答案是对@oikonang上面的评论的回应,他正确地注意到,如果存在相同顺序的连续0组,则此解决方案不起作用

要解决这个问题,这里有一些基本代码,可以包含在上面@Matt Jewett的代码中:

rle = unlist(sapply(1:length(rle(hours_delta)[[1]]), function(r) {
  if (rle(hours_delta)[[2]][r] == 0) {
     rep(rle(hours_delta)[[1]][r],rle(hours_delta)[[1]][r]) 
  } else {
  rep(NA, rle(hours_delta)[[1]][r]) }
}))
应将其包括在内,以代替

ifelse(hours_delta == 0,rle(hours_delta)[[1]][rle(hours_delta)[[2]] == 0],NA)

以上第行。

如果非零值之间有精确的3个零,该怎么办?另外,请您澄清小于3和大于1的含义。在代数方面,它是[1,3]、(1,3]、[1,3]还是(1,3)?如果非零值之间有精确的3个零呢?请你澄清小于3和大于1是什么意思。在代数方面,它是[1,3]、(1,3]、[1,3]还是(1,3)这正是我想要的!非常感谢!是否可以将相同的功能应用于data.tables?我的意思是,不使用管道和rle()函数,data.table格式的适当结果是什么。问题是,当我将其应用于示例数据帧时,它会起作用,但当我将代码应用于主data.table时,我会得到完全不同的结果。是否明智地将整个data.table转换为data.frame,然后再应用于data.table?我发现了问题所在lem是。尝试应用相同的功能,只需将Order_id替换为我正在寻找的
Order_id!非常感谢!是否可以将相同的功能应用于data.tables?我的意思是,不使用管道和rle()函数,data.table格式的适当结果是什么。问题是,当我将其应用于示例数据帧时,它会起作用,但当我将代码应用于主data.table时,我会得到完全不同的结果。是否明智地将整个data.table转换为data.frame,然后再应用于data.table?我发现了问题所在lem是。尝试应用相同的方法,只需将订单id替换为
订单id即可