【发布时间】:2021-12-01 12:59:33
【问题描述】:
晚上好,
我在 R 中有一个非常大的数据集,我正在尝试找到循环遍历它以解决一些问题的最佳方法。将数据想象为历史员工工作时间。它看起来像:
rawTable:
Department Name Date Hours
Engineering Mary 2021-01-01 8
Engineering Mary 2021-01-02 8
Engineering Mary 2021-01-03 0
Engineering Mary 2021-01-04 6
Sales Barry 2021-01-01 0
Sales Barry 2021-01-02 12
Sales Barry 2021-01-03 12
Sales Barry 2021-01-04 12
我的名单上大约有 3200 人,一年中的每一天都是一行,所以这张表显然很大。
我需要在表格中添加两列:
第一个是 LDO,显示(每天)他们的最后一天休息
第二个是 WSH 显示该人自上次休假以来工作了多少小时。看起来像:
rawTable:
Department Name Date Hours LDO WSH
Engineering Mary 2021-01-01 8 2020-12-31 8
Engineering Mary 2021-01-02 8 2020-12-31 16
Engineering Mary 2021-01-03 0 2021-01-03 0
Engineering Mary 2021-01-04 6 2021-01-03 6
Sales Barry 2021-01-01 0 2021-01-01 0
Sales Barry 2021-01-02 12 2021-01-01 12
Sales Barry 2021-01-03 12 2021-01-01 24
Sales Barry 2021-01-04 12 2021-01-01 36
我尝试使用 for 循环让它逐行应用逻辑。对于每一行,如果小时数为零,则 LDO=Date 且 WSH=0。如果不是,则前一行的 LDO=LDO 和前 + 小时的 WSH=WSH。使用这个尺寸设置,它需要永远半运行。
接下来我创建了一个函数,给定一行,使用大列表的副本,并根据“which”语句告诉我该人在行日期前 0 小时工作的最后一天的行号。这也花了很长时间。除此之外,我什至没有进入 WSH 部分。看起来像:
rawLU <- rawTable
LDO = function(x) {
max(c(0, which((rawLU$Name == x["Name"]) &
(rawLU$Hours == 0) & (rawLU$Date <= x[Date])
)))
}
LastOff<-apply(rawTable,1,LDO)
我知道有一种更简单的方法可以做到这一点,但我也知道我似乎无法弄清楚。
有人可以帮忙吗?提前致谢!
迈克
【问题讨论】: