2013-10-23 121 views
2

我的目標是根據條件有效地計算文件中字符串出現的次數。根據條件有效地計算文件中字符串的出現次數

我在輸入csv文件中有大約45k記錄。我需要將它們全部讀取並創建一個新文件,該文件描述了原始文件中特定時間段內字符串出現的次數。

輸入文件:

Timestamp    Field 
7/13/2013 10:30   ABC 
7/13/2013 11:30   ABC 
7/13/2013 10:34   ABC  
7/13/2013 10:15   CDE 
7/13/2013 10:00   ABC 
7/13/2013 10:14   CDE 
7/13/2013 12:30   ABC 
7/13/2013 00:30   ABC 
7/13/2013 07:30   CDE 

主要目標是到一個特定的時隙內計算領域出現。

輸出我期待的是:

Slots       ABC      CDE 
7/13/2013 00:01-03:00   1      0 
7/13/2013 03:01-06:00   0      0  
7/13/2013 06:01-09:00   0      1 
7/13/2013 09:01-12:00   4      2 
7/13/2013 12:01-15:00   1      0  
7/13/2013 15:01-18:00   0      0 
7/13/2013 18:01-21:00   0      0 
7/13/2013 21:01-24:00   0      0 

我寫了一個強力的代碼,做我的工作,但它需要大量的時間來完成。 我正在尋找一個高效的代碼來完成這項任務。

我有一個單獨的數據框,其中包含時間段(day_hour)和字段名稱(field_data)。我的蠻力方法是使用兩個for循環在兩個數據框的所有記錄中進行搜索並相應地計算出現次數。

請指導我,如果我可以使用像table()這樣的功能或在這種情況下可以提供幫助的東西。

回答

5

我會先轉換「時間戳」,以實際時間對象,然後使用cut創建你的三個小時的時間間隔,並使用table得到你正在尋找的輸出:

mydf$Times <- strptime(mydf$Timestamp, "%m/%d/%Y %H:%M") 
mydf$Breaks <- cut(mydf$Times, "3 hours") 
table(mydf$Breaks, mydf$Field) 
#      
#      ABC CDE 
# 2013-07-13 00:00:00 1 0 
# 2013-07-13 03:00:00 0 0 
# 2013-07-13 06:00:00 0 1 
# 2013-07-13 09:00:00 4 2 
# 2013-07-13 12:00:00 1 0 

下面是一些示例數據入手:

mydf <- structure(list(Timestamp = c("7/13/2013 10:30", "7/13/2013 11:30", 
    "7/13/2013 10:34", "7/13/2013 10:15", "7/13/2013 10:00", "7/13/2013 10:14", 
    "7/13/2013 12:30", "7/13/2013 00:30", "7/13/2013 07:30"), 
    Field = c("ABC", "ABC", "ABC", "CDE", "ABC", "CDE", "ABC", "ABC", "CDE")), 
    .Names = c("Timestamp", "Field"), 
    class = "data.frame", row.names = c(NA, -9L)) 

您還可以打用「data.table」(至少爲1.8.11+)並使用dcast.data.table。步驟區域或多或少相同。

library(data.table) 
library(reshape2) 
packageVersion("data.table") 
# [1] ‘1.8.11’ 

DT <- data.table(mydf) 
DT[, Times := as.POSIXct(strptime(Timestamp, "%m/%d/%Y %H:%M"))] 
DT[, Grps := cut(Times, "3 hours")] 
dcast.data.table(DT, Grps ~ Field, value.var="Field") 
# 'Aggregate function missing, defaulting to 'length' 
#     Grps ABC CDE 
# 1: 2013-07-13 00:00:00 1 0 
# 2: 2013-07-13 06:00:00 0 1 
# 3: 2013-07-13 09:00:00 4 2 
# 4: 2013-07-13 12:00:00 1 0 
+0

非常感謝。這正是我想要的。 :)答案的前三行簡直就是需要的,我不知道如何正確使用它們。你給了我如何去做的確切方式。再次感謝:) – N2M

+0

當我最近熟悉一些數據時,您的答案令人鼓舞。謝謝。 – Puriney

相關問題