重新编码R中每个组的第一行?

时间:2017-03-13 19:05:04

标签: r data.table

我试图理解如何重新编写R中一组的第一行。我理解如何抓住该组,我想快速的ifelse声明我可以做到这一点,但我想我正在接近这个错误。以下是样本:

library(data.table)


latemail <- function(N, st="2012/01/01", et="2012/02/01") {
  st <- as.POSIXct(as.Date(st))
  et <- as.POSIXct(as.Date(et))
  dt <- as.numeric(difftime(et,st,unit="sec"))
  ev <- sort(runif(N, 0, dt))
  rt <- st + ev

}

#create our data frame
set.seed(42)
dt = latemail(20)
work = setDT(as.data.frame(dt))
work[,worker:= stringi::stri_rand_strings(2, 5)]  
work[,dt:= as.POSIXct(as.character(work$dt), tz = "GMT")]
work[,status:=NA]

#order
setorder(work, worker, dt)

#add work times
work$status[5] = "end"
work$status[10] = "end"
work$status[15] = "end"
work$status[20] = "end"

我正在寻找最终产品看起来像这样,基本上为工人组开始每一行并编码开始,以及在一个连续的结束后的每一行&#34;结束&#34;:

              dt worker status
 1: 2012-01-04 23:11:31  VOuRp  start
 2: 2012-01-09 15:53:16  VOuRp     NA
 3: 2012-01-15 02:56:45  VOuRp     NA
 4: 2012-01-16 21:12:26  VOuRp     NA
 5: 2012-01-20 16:27:31  VOuRp    end
 6: 2012-01-22 15:34:05  VOuRp  start
 7: 2012-01-23 15:01:18  VOuRp     NA
 8: 2012-01-29 03:36:56  VOuRp     NA
 9: 2012-01-29 20:11:02  VOuRp     NA
10: 2012-01-31 02:48:01  VOuRp    end
11: 2012-01-04 10:24:38  u8zw5  start
12: 2012-01-08 17:02:20  u8zw5     NA
13: 2012-01-14 23:33:35  u8zw5     NA
14: 2012-01-15 12:23:52  u8zw5     NA
15: 2012-01-18 03:53:15  u8zw5    end
16: 2012-01-21 03:48:08  u8zw5  start
17: 2012-01-23 02:01:10  u8zw5     NA
18: 2012-01-26 12:51:10  u8zw5     NA
19: 2012-01-29 18:23:46  u8zw5     NA
20: 2012-01-29 22:22:14  u8zw5    end

我如何处理此问题,最好是在数据表中?

1 个答案:

答案 0 :(得分:1)

您可以在“site.Models.ViewModels.ClockGroupViewModel"参数中使用一些基数R来选择行,然后使用i来指定&#34; start&#34;值。

:=

这里,work[c(1, head(which(status == "end" & !is.na(status)) + 1, -1)), status := "start"] 返回一个整数向量,其中包含要填充的位置。 c(1, head(which(status == "end" & !is.na(status) + 1), -1))选择与&#34; end&#34;匹配的位置并且没有错过价值观。 + 1递增这些值。带有-1参数的which用于删除最终位置,因为它位于data.table之外。

返回

head