2017-05-24 35 views
0

我是R中的新成员,我一直在用条件挣扎,我想应用在data.table中。按R data.table中相应事件的数量标记行

我的data.table由Order_id和Date排序,看起来像这样。 this

我需要的是与这些条件检举人变量创建新列:

  • 如果有3个以上的连续0 hours_delta柱然后用flag_1之前标记这些线和线

  • 如果有小于3,并且在hours_delta 大于1的连续的0,然后前标记这些线和线与flag_2

  • 如果仅存在一个0 2是超过0象行索引之间[8]然后标记这些线与flag_3

  • 标记所有其余与flag_4

这是我想该表看起来像在新列后面。 this

任何帮助,将不胜感激。

谢谢!

+0

如果在非零值之间有3个确切的零,该怎么办? – amonk

+0

也可以请澄清*小于3和超过1 *的含义。就代数而言,它是[1,3],(1,3],[1,3]还是(1,3)? – amonk

回答

1

我觉得像这样的东西可能会为你正在努力完成的工作。

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) 
+0

这就是我正在寻找的!非常感谢你! – oikonang

+0

是否可以将相同的功能应用于data.tables?我的意思是,不使用管道和rle()函数,data.table格式的结果是什么。问题在于,当我将它应用于示例数据框时它可以工作,但是当我将代码应用于主data.table时,我得到完全不同的结果。将整个data.table转换为data.frame只适用于上面然后返回data.table是明智的吗? – oikonang

+0

我想出了问题所在。尝试通过用Order_id < - c(rep(001,8))'替换Order_id来应用相同的方法。因此,如果在同一个Order_id中有多个连续的0次计数,它会混乱起来。有没有办法呢? – oikonang