2013-02-26 34 views
0

我有一個包含三列的數據幀:DATE,HOUR,HRC (因此每個DATE有24行) HRC列有時是數字,有時是NA 。 我想弄清楚一種方法來獲取DATE的子集,然後計算出在所有日子中都具有非NA值的HOUR。確定多天中的哪些小時具有非NA值

例如:如果日期是Aug16,Aug18,Aug19,並且HRC列在8月16日HOURS 8,9,10,11,12 ... Aug18在HOURS 7,8,9,10時具有非NA值,11 ... 8月19日在9,10,11,12,13小時。我希望得到的結果是9,10,11小時的清單,因爲那些日期是所有日期的非NA小時。在Gary的解決方案中調整總和(is.na(x $ HRC))以求和(!is.na(x $ HRC))是有用的。感謝大家!

+0

我尋求建議在R.由於編碼的條件! – EricaO 2013-02-26 23:47:51

+1

您能提供一個可重現的例子,並顯示您期望的結果。我有點困惑。 – agstudy 2013-02-27 00:03:21

+0

DATE \t \t HOUR HRC 11年8月15日\t \t 1 NA 11年8月15日\t \t 2 NA 11年8月15日\t \t 3 NA 11年8月15日\t \t 4 NA 8.15/11 \t \t 5 NA 11年8月15日\t \t 6 NA 11年8月15日\t \t 7 20 11年8月15日 11年8月15日 11年8月15日10 \t 11年8月15日\t \t 11 20 11年8月15日 11年8月15日\t \t 13 20 11年8月15日 11年8月15日15 \t 11年8月15日\t \t 16 20 11年8月15日 11年8月15日\t \t 18 NA /08/19 \t NA 11年8月15日20 \t \t NA 11年8月15日\t \t 21 NA 11年8月15日\t \t 22 NA 11年8月15日\t \t 23 NA 11年8月15日 NA – EricaO 2013-02-27 00:58:01

回答

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))) 
+0

我得到「錯誤:無法找到函數」 ddply「」 – EricaO 2013-02-27 00:27:22

+0

對不起,它是'plyr'包內發現的,我已經更新了代碼,以反映該;-) – 2013-02-27 00:29:06

+0

奇怪,我再拿到:」在圖書館錯誤( plyr):沒有包稱爲「plyr」「 – EricaO 2013-02-27 00:32:11

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 
+0

@mjv是的,我明白你的意思。和更新我的解決方案。 – agstudy 2013-02-27 01:04:59

+0

感謝您的幫助! – EricaO 2013-02-27 01:32:19

+0

@ user2113323你是開山鼻祖。你與你的DATAS測試我的解決方案? – agstudy 2013-02-27 01:33:19