【发布时间】:2019-11-07 08:35:24
【问题描述】:
我是 R 新手,所以如果我问一个明显的问题,我很抱歉。我搜索了一周,但没有找到解决方案。
我有一个包含许多列和行的数据框。 现在我想删除所有行,如果:
A 列的时间范围为例如仅 8 小时 NA 值 然后删除该范围内的所有行。
背景:最初我想删除周末发生的行,因为这不是工作日/小时。但是我在一周中也没有“随机”发生的工作日/小时。所以我只想要设备实际工作的数据。而且我的表并没有因为这个不是真正的缺失值的“缺失值”而搞砸。
我找到的唯一一段代码如下:
df[-which(rowMeans(is.na(df)) > 0,3), ]
我认为有可能根据我的条件修改此代码,但我不知道。 目前它只查看每一行并决定是否有超过 30% 的 NA。但这还不够,因为我有几个星期的数据,在此之前我无法说出 NA 出现的频率和时间范围。
这里是一个例子:
df <- data.frame(DateTime = c('2019-05-31 08:23:00', '2019-05-31 09:46:00', '2019-05-31 10:00:00', '2019-05-31 11:07:00', '2019-05-31 11:10:00','2019-05-31 11:56:00', '2019-05-31 12:06:00', '2019-05-31 12:56:00', '2019-05-31 14:16:00', '2019-05-31 15:45:00', '2019-05-31 16:03:00', '2019-05-31 17:05:00', '2019-05-31 18:00:00', '2019-05-31 19:30:00', '2019-05-31 20:01:00'),
A=c(NA, 1, 2, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA ),
B = c(NA, 2.4, 3, 5, NA, NA, 2.5, NA, NA, 2.6, NA, NA, NA, 1, 2))
DateTime A B
1 2019-05-31 08:23:00 NA NA
2 2019-05-31 09:46:00 1 2.4
3 2019-05-31 10:00:00 2 3.0
4 2019-05-31 11:07:00 NA 5.0
5 2019-05-31 11:10:00 NA NA
6 2019-05-31 11:56:00 NA NA
7 2019-05-31 12:06:00 NA 2.5
8 2019-05-31 12:56:00 NA NA
9 2019-05-31 14:16:00 NA NA
10 2019-05-31 15:45:00 NA 2.6
11 2019-05-31 16:03:00 NA NA
12 2019-05-31 17:05:00 NA NA
13 2019-05-31 18:00:00 NA NA
14 2019-05-31 19:30:00 NA 1.0
15 2019-05-31 20:01:00 NA 2.0
另外还有一个说法是,我没有与时间范围相对应的固定数量的行。 NA 值可以在定义的 8 小时时间范围内出现 8,76 或 10 次。
这就是我想要的样子:
DateTime A B
1 2019-05-31 08:23:00 NA NA
2 2019-05-31 09:46:00 1 2.4
3 2019-05-31 10:00:00 2 NA
4 2019-05-31 20:01:00 1 2.0
我希望我正确地描述了我的问题,并且有人能够帮助我。
非常感谢!
更新:我找到了一个循环解决方案,但它非常缓慢。有人可以提出更快的建议吗?对于 400k 行,循环需要 1 小时...因此,行数每天都在增加,这不是使用循环运行的解决方案。
代码如下: A
startIndex = -1
for(i in 1:nrow(AggregatedTable))
{
if (is.na(A[i]))
{
if (startIndex == -1)
{
startIndex = i;
}
}
else
{
if (startIndex != -1)
{
lastIndex = i - 1
if((difftime(D[lastIndex], D[startIndex]) >= 8))
{
AggregatedTable <- AggregatedTable[-(startIndex:lastIndex), , drop = FALSE]
}
startIndex = -1
}
}
}
【问题讨论】:
标签: r conditional-statements na posixct