我有一个data.frame代表几个工作人员在两年内的几个月的时间表。数据看起来像:
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列,每列代表相应月份的日期。将有多个具有相同名称的行。
所以看看第一个条目,约翰史密斯在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
日期需要正确格式化,但这不是主要的。问题是将月份与相关月份和年份相匹配以生成复合日期。欢迎任何想法。
我会通过将花费的总时间转换为数字来实现此目的。根据数据的结构,您可以用冒号分割此字符串并将分钟转换为小时,将sum转换为小数小时。
有点像这样:
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)
如果您只需按月报告,则必须以某种方式提取月份名称,但没有什么难的。
在跟进@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。