我正在使用1分钟的太阳能PV间隔时间序列数据,其中原始时间戳具有连接在一起的日期和时间。我使用sub()来分割日期和时间,然后使用cbind()将它们添加到我的数据帧中。起初看起来一切都很好,但我想构建一个小错误检查器,确保日期和时间与原始字符串匹配,如果它们不匹配,那么它将返回行索引供我进一步排除故障。我的想法是使用grepl +来识别匹配/不匹配。下面的代码显示了我正在使用的内容。
> head(data2)
dates times datetime use..kW. gen..kW. Grid..kW.
1 12/31/2013 23:58 12/31/2013 23:58 1.463883 -0.003050000 1.463883
2 12/31/2013 23:57 12/31/2013 23:57 1.940267 -0.003450000 1.940267
3 12/31/2013 23:56 12/31/2013 23:56 1.934417 -0.003466667 1.934417
4 12/31/2013 23:55 12/31/2013 23:55 1.996050 -0.003550000 1.996050
5 12/31/2013 23:54 12/31/2013 23:54 2.009883 -0.003566667 2.009883
6 12/31/2013 23:53 12/31/2013 23:53 2.009967 -0.003516667 2.009967
Solar..kW. Solar...kW.
1 -0.003050000 0
2 -0.003450000 0
3 -0.003466667 0
4 -0.003550000 0
5 -0.003566667 0
6 -0.003516667 0
> a <- grepl("23:56", data2[, 3])
> which(a == TRUE)
[1] 3 1443 2883 4323 5763 7203 8643 10083 11523
上面的结果()对应于datetime列中字符串中“23:56”的所有行。我只复制了一行返回向量以节省空间......
我知道,对于我的检查器,我想识别错误的情况,现在使用TRUE只是为了说明。我遇到的问题与在grepl()中使用多个字符串有关,因为我不只想用一个时间值来执行此操作,而是对于我的数据帧中的每一行。我尝试使用grepl的mapply,但是我的数据帧有478,933个观察结果,因此它已经取消了很长时间。 mapply + grepl看起来像:
mapply(grepl, data2$dates, data2$datetime)
我在一系列观察中使用了相同的mapply函数(200)。当设置为TRUE时,我得到200行的索引,FALSE我得到整数(0) - 我理解这意味着我的数据是准确的所以这可能是不必要的......但现在我投资于更多的学习/锻炼观点,它将有助于我处理更大的数据集。
很抱歉很长时间的问题。提前感谢您的建议。
第2部分:
我对不提供可重复数据表示歉意。我的数据太大,无法将整个数据帧发布到SO。另外@ G.Grothendieck,我正在分割日期时间字符串,因为我将使用tapply或split来获取每个时间间隔的采样分布,即我将有1,440个“桶”,对应于一天中的每分钟。每个桶将由整年的那个时间间隔的观察结果填充。
这是一个新版本(data3),它是data2的头。我已将data3 [3,2]的值更改为“23:57”,这与datatime列中的时间不匹配,因此我们可以使用它来测试您的两个解决方案。贾斯汀是第一个,其次是G.Grothendieck。
> data3 <- head(data2)
> data3[3,2] <- "23:57"
> data3
dates times datetime use..kW. gen..kW. Grid..kW. Solar..kW.
1 12/31/2013 23:58 12/31/2013 23:58 1.463883 -0.003050000 1.463883 -0.003050000
2 12/31/2013 23:57 12/31/2013 23:57 1.940267 -0.003450000 1.940267 -0.003450000
3 12/31/2013 23:57 12/31/2013 23:56 1.934417 -0.003466667 1.934417 -0.003466667
4 12/31/2013 23:55 12/31/2013 23:55 1.996050 -0.003550000 1.996050 -0.003550000
5 12/31/2013 23:54 12/31/2013 23:54 2.009883 -0.003566667 2.009883 -0.003566667
6 12/31/2013 23:53 12/31/2013 23:53 2.009967 -0.003516667 2.009967 -0.003516667
Solar...kW.
1 0
2 0
3 0
4 0
5 0
6 0
> all(paste(data3$dates, data3$times) == data3$datetime)
[1] FALSE
> which(paste(data3$dates, data3$times) != data3$datetime)
[1] 3
> with(data3, which(format(datetime) != paste(dates, times)))
[1] 3
所以,它们都导致相同的结果......但是当我在整个数据帧(data2)上使用G.Grothendieck的解决方案时,它说行840:24279是不匹配的。以下是输出的前两行:
> with(data2, which(format(datetime) != paste(dates, times)))
[1] 840 841 842 843 844 845 846 847 848 849 850 851
[13] 852 853 854 855 856 857 858 859 860 861 862 863
我把不匹配的前6行放入一个新的df(data4)。然后再次应用您的每个解决方案......
> data4
dates times datetime use..kW. gen..kW. Grid..kW. Solar..kW.
840 12/31/2013 9:59 12/31/2013 9:59 4.480733 5.948300 -1.4675667 5.948300
841 12/31/2013 9:58 12/31/2013 9:58 4.503950 5.832533 -1.3285833 5.832533
842 12/31/2013 9:57 12/31/2013 9:57 4.516283 5.739600 -1.2233167 5.739600
843 12/31/2013 9:56 12/31/2013 9:56 4.906783 5.677033 -0.7702500 5.677033
844 12/31/2013 9:55 12/31/2013 9:55 5.951183 5.621617 0.3295667 5.621617
845 12/31/2013 9:54 12/31/2013 9:54 6.226417 5.596517 0.6299000 5.596517
Solar...kW.
840 5.948300
841 5.832533
842 5.739600
843 5.677033
844 5.621617
845 5.596517
> all(paste(data4$dates, data4$times) == data4$datetime)
[1] TRUE
> which(paste(data4$dates, data4$times) != data4$datetime)
integer(0)
> with(data4, which(format(datetime) != paste(dates, times)))
integer(0)
>
这再次显示您的解决方案是相同的,但我很困惑为什么当我在整个数据帧(data2)上使用G.Grothendieck时为什么它输出840:24279为不匹配。如果这些数据足够,请告诉我。
答案 0 :(得分:0)
你可以使用矢量化布尔比较......
all(paste(data2$dates, data2$times) == data2$datetime)
如果一切都匹配,则应返回TRUE
,否则返回FALSE
。您也可以将其打包在which
中,然后使用!=
来查看不匹配的行。
which(paste(data2$dates, data2$times) != data2$datetime)
最后,我尽可能避免使用正则表达式(和sub
)。相反,我会使用这样的东西:
splits <- strsplit(data2$datetime, ' ')
data2$dates <- sapply(splits, '[', 1)
data2$times <- sapply(splits, '[', 2)
答案 1 :(得分:0)
这会给出date
和time
与日期时间不匹配的行号
with(data2, which(format(datetime) != paste(date, time)))
您可能不需要format
部分但由于数据未在问题中以可复制的形式提供,因此我们无法分辨。
另外,考虑一下你是否真的需要首先分割datetime
。