按R data.table中的后续出现次数标记行
我是R方面的新手,我一直在努力解决一个我想在data.table中应用的条件 我的data.table按订单id和日期排序,如下所示 我需要的是创建一个新列,其中包含一个具有以下条件的flagger变量:按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标记所有其余部分 这就是我希望表格在新列之后的样子 任何帮
- 如果在小时数增量列中有超过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即可