2014-03-25 33 views
0
myFunction <- function(x){ 
for(i in 0:23) 
{ 
if(i<10){ 
    timer <- paste("T0",i, sep ="") 
    tempr <- grepl(timer,x) 
    tempr <- table(tempr)["TRUE"] 
    timeCount <- c(timer,tempr) 
} 
else{ 
    timer <- paste("T",i,sep="") 
    tempr <- grepl(timer,x) 
    tempr <- table(tempr)["TRUE"] 
    timeCount <- c(timer,tempr) 
} 
} 
return(timeCount) 
} 
tmp <- myFunction(test$timestamp) 

我所試圖做的是在功能,我對循環23倍,併產生兩個值timer(包含諸如T00,T01,T02值... T23)和tempr(包含像23,24,25 ...的值)。現在我想所有兩個變量的23個各自的值存儲在數據幀,使我最終輸出是如何,使用R來連接在一個循環中得到的結果

TimeZ Freq 
T00 33 
T01 12 
T02 22 
T04 34 
    .  . 
    .  . 
    .  . 
T23 23 

回答

1

有幾個教訓可以在這裏學到。您可以使用seq(0,23)構造初始序列,爲每個值創建1行數據框,並使用do.callrbind將它們連接起來。您不需要pasteif,因爲您可以根據需要使用sprintf添加0。最後,您不需要在grepl上使用table,因爲which可以做同樣的事情並且更簡潔。

myFunction <- function(x) do.call(rbind, lapply(seq(0, 23), function(i) 
    data.frame(TimeZ = timer <- sprintf("T%02d", i), 
      Freq = which(grepl(timer, x))[1]) 
)) 

# example: 
myFunction(sprintf("T%02d", sample(seq(0,23)))) 

# TimeZ Freq 
# 1 T00 14 
# 2 T01 24 
# 3 T02 2 
# 4 T03 7 
# 5 T04 19 
# ---- 
# TimeZ Freq 
# 20 T19 9 
# 21 T20 21 
# 22 T21 22 
# 23 T22 15 
# 24 T23 13 

如果我們被允許假設x包含T00T01,...,T23(他們中的每一個單),然後就變得更短:

myFunction <- function(x) data.frame(TimeZ = sprintf("T%02d", seq(0, 23)), 
             Freq = order(x)) 
+0

X將是一個值像「2008-08-13T23:04:10Z」....所以我使用grepl來查看T00,T01 ...是否存在... – tanay

+0

你的代碼是有效率的,但我必須做一些在得到想要的結果之前做小的改變..我必須寫下「Freq = table((grepl(timer,x)))[」TRUE「]」來代替「Freq = which(grepl(timer,x))[1 ]」 – tanay