根据每天的条目总数删除多个数据条目

时间:2015-10-16 16:24:54

标签: r

我从R中的一个标题为'dat'的数据框开始,如下所示:

     datetime           lat       long      id extra    step
1   8/9/2014 13:00  31.34767    -81.39117   36  1   31.38946
2   8/9/2014 17:00  31.34767    -81.39150   36  1   11155.67502
3   8/9/2014 23:00  31.30683    -81.28433   36  1   206.33342
4   8/10/2014 5:00  31.30867    -81.28400   36  1   11152.88177

我需要做的是找出哪些日期少于3个条目,并从原始数据中删除与这些日期相关的所有条目。

我最初是通过以下方式做到的:

library(plyr)
datetime<-dat$datetime
###strip the time down to only have the date no hh:mm:ss 
date<- strptime(datetime, format = "%m/%d/%Y")
### bind the date to the old data
dat2<-cbind(date, dat)
### count using just the date so you can ID which days have fewer than 3 points
datecount<- count(dat2, "date")
datecount<- subset(datecount, datecount$freq < 3)

最终产生以下结果:

row.names   date    freq
1   49  2014-09-26  1
2   50  2014-09-27  2
3   135 2014-12-21  2

哪个好,但我无法弄清楚如何从原始'dat'中删除少于三个条目的条目,因为这是原始数据框的压缩版本。

因此,为了尝试解决这个问题,我想出了另一种解决问题的方法。我将使用上面的strptime和cbind:

datetime<-dat$datetime
###strip the time down to only have the date no hh:mm:ss 
date<- strptime(datetime, format = "%m/%d/%Y")
### bind the date to the old data
dat2<-cbind(date, dat)

我将使用标题为“额外”的专栏。我想创建一个新列,它是通过简化的strptime日期将此“额外”列中的值相加的结果。但是找到一种方法将这个新值应用于该日期的所有条目,如下所示:

    date        datetime         lat        long      id extra extra_sum
1   2014-08-09  8/9/2014 13:00  31.34767    -81.39117   36  1     3
2   2014-08-09  8/9/2014 17:00  31.34767    -81.39150   36  1     3
3   2014-08-09  8/9/2014 23:00  31.30683    -81.28433   36  1     3
4   2014-08-10  8/10/2014 5:00  31.30867    -81.28400   36  1     4
5   2014-08-10  8/10/2014 13:00 31.34533    -81.39317   36  1     4
6   2014-08-10  8/10/2014 17:00 31.34517    -81.39317   36  1     4
7   2014-08-10  8/10/2014 23:00 31.34483    -81.39283   36  1     4
8   2014-08-11  8/11/2014 5:00  31.30600    -81.28317   36  1     2
9   2014-08-11  8/11/2014 13:00 31.34433    -81.39300   36  1     2

创建“extra_sum”列的代码是我正在努力的方法。

创建后,我可以简单地将数据子集化为值> 2的所有条目。任何帮助找出如何使用我的初始方法或新的方法来删除我的初始数据集中少于3个条目的日期将非常感谢!

2 个答案:

答案 0 :(得分:0)

我建议使用data.table包

library(data.table)
dat<-data.table(dat)
dat$Date<-as.Date(as.character(dat$datetime), format = "%m/%d/%Y")
dat_sum<-dat[, .N, by = Date ]
dat_3plus<-dat_sum[N>=3]
dat<-dat[Date%in%dat_3plus$Date]

答案 1 :(得分:0)

plyr方式。

library(plyr)
datetime <- dat$datetime
###strip the time down to only have the date no hh:mm:ss 
date <- strptime(datetime, format = "%m/%d/%Y")
### bind the date to the old data
dat2 <-cbind(date, dat)

dat3 <- ddply(dat2, .(date), function(df){
    if (nrow(df)>=3) {
        return(df)
    } else {
        return(NULL)
    }
})