我试图理解如何重新编写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
我如何处理此问题,最好是在数据表中?
答案 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