r - 删除给定日期内点数少于n个的列

时间:2013-05-31 09:52:30

标签: r posixct

我有一个data.frame如下:

Dat1 <- data.frame(dateTime = as.POSIXct(c("2012-05-03 00:00","2012-05-03 02:00",
                                           "2012-05-03 02:30","2012-05-03 05:00",
                                           "2012-05-03 07:00","2012-05-04 07:00"), 
                                         tz = 'UTC'),x1 = rnorm(6))

,并提供:

> Dat1
             dateTime         x1
1 2012-05-03 00:00:00 -0.3529501
2 2012-05-03 02:00:00  1.9086742
3 2012-05-03 02:30:00 -0.4707939
4 2012-05-03 05:00:00 -1.7001035
5 2012-05-03 07:00:00 -1.3389383
6 2012-05-04 07:00:00  0.6985237

我想将此data.frame减少为仅包含给定日期超过n个点的行。所以,如果我要说n = 2,Dat1应该减少到:

> Dat1
             dateTime         x1
1 2012-05-03 00:00:00 -0.3529501
2 2012-05-03 02:00:00  1.9086742
3 2012-05-03 02:30:00 -0.4707939
4 2012-05-03 05:00:00 -1.7001035
5 2012-05-03 07:00:00 -1.3389383

我希望这对任意数量的列的data.frame都有用,即不仅仅是这个例子。

1 个答案:

答案 0 :(得分:1)

一种直截了当的方法是使用as.Datetable来计算每天的数据点数。手动解决方案可能如下所示:

n <- 2
Dat1[as.character(as.Date(Dat1$dateTime)) %in% 
       names(which(table(as.Date(Dat1$dateTime)) >= n)), ]

使用它,您还可以创建一个基本功能,如果这是您想要经常做的事情,并且您想要更改某些参数。这是一个快速尝试的功能:

DateThreshold <- function(input, datevar, threshold) {
  datevar <- as.character(as.Date(input[[datevar]]))
  datevar.tab <- names(which(table(datevar) >= threshold))
  input[datevar %in% datevar.tab, ]
}

使用您的示例数据将是这样的:

DateThreshold(Dat1, "dateTime", 2)
#              dateTime          x1
# 1 2012-05-03 00:00:00 -0.36532709
# 2 2012-05-03 02:00:00 -0.52474466
# 3 2012-05-03 02:30:00 -0.06044233
# 4 2012-05-03 05:00:00  0.51963463
# 5 2012-05-03 07:00:00 -0.34407808