首页 文章

根据条件有效计算文件中字符串的出现次数

提问于
浏览
2

我的目标是以有效的方式根据条件计算文件中字符串的出现次数 .

我在输入csv文件中有大约45k条记录 . 我需要全部读取它们并创建一个新文件,该文件描述了特定持续时间内原始文件中字符串的出现次数 .

Input File:

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

主要目标是计算特定时段内的字段出现次数 .

output 我期待的是:

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() 之类的功能或者在这种情况下可以提供帮助的功能,请指导我 .

1 回答

  • 5

    我首先将"Timestamp"转换为实际时间对象,然后使用 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
    

相关问题