我有一个data.frame,它代表数名员工在2年的几个月内的时间表。数据如下:
Name Month 1 2 3 ... 31 Total Job ... [more columns]
John Smith Aug 2017 1:20 1:20 Typing
Mary Jones Sep 2017 Prooing
John Smith Oct 2017 0:15 1:10 1:25 Typing
...
Jim Miles Feb 2018 1:30 2:10 3:40 Admin
共有31列,每列代表相应月份中的日期。将有多个具有相同名称的行。
约翰·史密斯(John Smith)于2017年8月1日完成了1小时20分钟的工作。
我想做的就是以细粒度的方式分析这些数据,例如
我对如何进行处理以分析数据有些困惑。建议表示赞赏。
为澄清起见而添加:
阅读了三个非常有用的答复并查看了tidyr
之后,我澄清了我的想法,并认为我需要修改数据,因此每个条目只有一行,因此示例表将变为:>
Name Date Duration Job ... [more columns]
John Smith 01 Aug 2017 1:20 Typing
John Smith 02 Oct 2017 0:15 Typing
John Smith 31 Oct 2017 0:15 Typing
...
Jim Miles 02 Feb 2018 1:30 Admin
Jim Miles 03 Feb 2018 2:10 Admin
日期将需要正确格式化,但这并不重要。问题是将月份中的日期与相关的月份和年份进行匹配以产生组合日期。欢迎提出任何想法。
答案 0 :(得分:0)
我可以通过将花费的总时间转换为数字来解决这个问题。根据数据的结构,您可以用冒号分隔此字符串,然后将分钟转换为小时,然后将总和转换为十进制小时。
与此类似:
x <- c("1:20", "1:25", "3:40")
x <- strsplit(x, ":")
sapply(x, FUN = function(m) {
m <- as.numeric(m)
sum(m[1], m[2]/60)
})
[1] 1.333333 1.416667 3.666667
然后,您可以使用aggregate
来按月份,年份和名称求和。
aggregate(Total ~ Name + Month + Job, data = xy, FUN = sum)
如果您只需要按月份报告,则必须以一种或另一种方式提取月份名称,但这并不困难。
答案 1 :(得分:0)
在遵循@Khlick的建议之后,我成功使用了gather()
:
mydata <- mydata %>% gather(new_date, time_spent, "1":"31")
这将产生两个新列new_date
和time_spent
,然后为列1–31的每个数据点创建一个新行。
所以现在对于每个数据点,我都有一个月,例如Aug 2017
在某一列中,即工作完成的日期,例如12
在另一个。我将月份更改为原始电子表格中的日期,因此它变成了2017-08-01
(所有日期现在都为01)。然后在R
中,我用substr()
和paste()
将日期替换为正确的日期,即2017-08-12
。
最后,我剩下大量的行,time_spent
中没有值。我删除了这些行。
我现在有:
名称日期持续时间工作... [更多列]
John Smith 2017-08-01 1:20 Typing
John Smith 2017-10-02 0:15 Typing
John Smith 2017-10-31 0:15 Typing
...
Jim Miles 2018-02-02 1:30 Admin
Jim Miles 2018-02-03 2:10 Admin
我进行了一些抽查,似乎数据转换正确。感谢所有人,尤其是@Khlick。