我有一个包含三列的数据框:DATE,HOUR,HRC (因此每个DATE有24行) HRC列有时是数字,有时是NA。 我试图找出一种方法来获取DATE的子集,然后计算出所有日期都具有非NA值的HOUR。
示例:因此,如果DATES是8月16日,8月18日,8月19日,并且HRC列在8月16日的8,9,10,11,12 ... 8月18日的HOURS 7,8,9,10中具有非NA值, 11 ... Aug19 at HOURS 9,10,11,12,13。我希望结果是HOURS 9,10,11的列表,因为这些是所有日期的非NA小时。
在加里的解决方案中将总和(is.na(x $ HRC))调整为sum(!is.na(x $ HRC))就可以了。谢谢大家!
答案 0 :(得分: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
答案 1 :(得分: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)))