欢迎光临散文网 会员登陆 & 注册

R语言学习记录:lubridate处理时序数据计算某一区间的均值和sum

2022-05-11 01:48 作者:孤独的王大老实  | 我要投稿

前一段时间帮师妹处理了一个数据,也借这个机会进一步学习了一下lubridate包。

数据描述:

数据长这样


需求:

求ABC三个变量每天7点到11点之间的均值,以及D变量每天的sum

处理思路和过程:

1.首先先把xlsx文件导入进R,关于如何用R处理excel文件可以参考往期记录

能发现问题吗?

1.1出现了2个问题

(1)提示有warnings

用warnings()检查一下发现给的提示是这样的

我直译一下:“强迫把文本变成了数值在巴拉巴拉巴拉‘NaN’”

于是我猜测原本的数据有Na值,返回原表去检查,果然如此

在把这些含有NaN的行删掉后,另存为‘test1.xlsx’,然后再导进R,就没有warnings了,证明我的直译是准确的(学习英语很重要!

虽然手动在原来的excel里可以手动删除含有NaN的行,但是并不推荐这样做,因为数据可能有好几千好几万行,不可能一个一个去检索NA然后删掉,另外warnings只是代表警告,并不是说明这行代码没有运行成功,所以还是在后续代码中处理NaN较为快捷。

(2)变量‘time’列发生了改变

原来的time列是‘1:30:00’格式(时分秒hms),代表一点半,但是导入进R后变成了年月日(ymd)的格式。

1.2关于第二个问题的解决过程

在Stack Overflow上找到了两个类似的问题

Q1:

这个问题有三个答案:

第一个答案是利用format和hms函数进行转换

第二个答案是利用‘openxlsx’包读取

但我在用这个包进行读取的时候失败了,给的结果是这样式的

当时我也搜索了相关问题,但是具体什么原因我忘记了,反正就是还得再设置一下,我嫌麻烦就没有再继续探究,有了解这个问题的大手子还请多指点!

第三个答案是利用‘xlsx’包读取


但是这个包我至今都library不出来,一加载就重启(焯!)。(好像是和Java有关)

Q2

第二个问题,有很详尽的解释,大概意思是excel和R有不同的计算日期的标准。有兴趣的朋友可以前往原网站仔细阅读。

2.处理导入的数据框

导入xlsx后,就要开始处理了。此处需要注意的是我并没有理会在第一步中出现的两个问题,没有理会问题1的原因已经说明,不理会问题二的原因是:我发现如果不去管它在后面的拆分日期中也是不影响的。

2.1根据需求,把日期拆分为年、月、日、时、分

在这里还遇到了一个小小的问题,就是要求均值的三个变量,是7点00到11点00的数据,如果用hour>=7&hour<=11来进行筛选的话,会发现11点30的数据也包括进去了。最后的解决办法是,一个一个的指定时间点。新增一列‘newhour’,把数据分为两类,一类是7点00到11点00的,标记为y。另一类是不在这个时间区间的,标记为n。

最终结果


2.2分别计算ABC变量的均值和D的sum


变量A每一天的7点到11点的均值

group_by函数就是用来分组,比如我这里把月、日、newhour作为分类标准进行了分组,那么分组的结果就是5月1日y的数据为一组,5月1日n的数据为1组,5月2日y的数据为1组,5月2日n的数据为1组,以此类推。

然后再用管道传递给summarize函数计算均值。

2.3合并数据,导出为csv

用全连接函数把数据框拼接,其实也可以用cbind函数。

需要注意的是:full_join函数只能两个两个的连,不能一股脑的把所有的数据框都扔进去。

抒情time:

当时随口吹了一句牛逼说“用R处理应该不难吧”,没想到师妹放弃了“不食嗟来之食”的傲骨,打蛇随棍上,我虽然心里害怕吹牛逼吹过头,万一弄不好咋整,但是当时也只能硬着头皮把这逼装完,结果最后真的让我2个小时给弄好了,不免有点沾沾自喜,甚至还发了个动态作为纪念。

现在想来给自己的教训有三点:

  1. 不吹牛逼能死吗!

  2. 不吹牛逼能死吗!!

  3. 不吹牛逼能死吗!!!


R语言学习记录:lubridate处理时序数据计算某一区间的均值和sum的评论 (共 条)

分享到微博请遵守国家法律