0

我有一个包含三列的数据框:DATE、HOUR、HRC(因此每个 DATE 有 24 行)HRC 列有时是数字,有时是 NA。我试图找出一种方法来获取 DATE 的子集,然后找出在所有日子中具有非 NA 值的 HOUR。

示例:因此,如果 DATES 是 Aug16、Aug18、Aug19,并且 HRC 列在 Aug16 在 HOURS 8、9、10、11、12... Aug18 在 HOURS 7、8、9、10、11 时具有非 NA 值。 .Aug19 在 9、10、11、12、13 小时。我希望结果是 9、10、11 小时的列表,因为这些是所有日期的非 NA 小时。

在 Gary 的解决方案中将 sum(is.na(x$HRC)) 调整为 sum(!is.na(x$HRC)) 就可以了。谢谢大家!

4

2 回答 2

1

您没有提供示例,因此我们对您的问题感到非常困惑。提供一个可重现的例子通常是有建设性的。即使我承认使用日期类型创建示例有点挑战。

set.seed(1234)
#generate sequence of 25 days hour by hour
x <- Sys.time() + seq(1,by=60*60,length.out=24*25)
hh <- as.POSIXlt(x)$hour
## generate the data.frame
dat <- data.frame(DATE = as.POSIXct(format(x,"%Y-%m-%d")),
                  HOUR=as.POSIXlt(x)$hour,
                  HRC  = 1:length(x))
## introduce random NA
id <- sample(nrow(dat),10,rep=F)
dat$HRC[id] <- NA

我的解决方案从这里开始;它类似于 Gary 解决方案,我使用的是plyr包但具有不同的功能。

## I choose 2 dates to subset
min.d <- as.POSIXct('2013-03-01')
max.d <- as.POSIXct('2013-03-15')

dat.s <- subset(dat, DATE >=min.d & DATE <= max.d )


res <- ddply(dat.s, .(HOUR),   ## grouping by hour
      function(x){   
        any(is.na(x$HRC))  ## I retuen one HRC at least is NA
      })

结果:

res[res$V1,]
  HOUR   V1
6     5 TRUE
12   11 TRUE
14   13 TRUE
17   16 TRUE
19   18 TRUE
22   21 TRUE
于 2013-02-26T23:53:17.757 回答
0

你可以尝试这样的事情:

library(plyr)

# assuming your dates are in some date format
d_0 <- as.Date('02-01-2010',format='%m-%d-%Y')

d_1 <- as.Date('02-10-2010',format='%m-%d-%Y')

# assuming your data are in data frame 'dat', get some subset of dates
some_dates <- subset(dat, DATE > d_0 & DATE < d_1)

# count the NAs for each hour
hr_count <- ddply(some_dates, .(HOUR), function(x) sum(!is.na(x$HRC)))
于 2013-02-27T00:05:50.383 回答