【问题标题】:Reshape table to create time series aggregated by prefix重塑表格以创建按前缀聚合的时间序列
【发布时间】:2016-02-06 22:33:39
【问题描述】:

我有一个类似于以下的表格:

name,time_in,time_out
jim,1/1/2000 08:24,1/1/2000 15:24
jim,1/2/2000 08:13,1/2/2000 16:24
jim,1/3/2000 08:14,1/3/2000 15:25
jim,1/4/2000 08:33,1/4/2000 16:23
linda,1/1/2000 08:24,1/1/2000 15:24
mark,1/2/2000 08:13,1/2/2000 16:24
mark,1/3/2000 08:14,1/3/2000 15:25
mark,1/4/2000 08:33,1/4/2000 16:23

忽略实际时间,重点是日子不排队。我所看到的大多数重新整形的东西都很好而且很方正,我的数据最终可能会被稀疏地重新整形。有没有一种简单的方法(寻找 R 解决方案,但可以打开 Excel 或其他任何快捷方式)来创建类似于以下的表聚合:

jim,1/1/2000 08:24,1/1/2000 15:24,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23
linda,1/1/2000 08:24,1/1/2000 15:24
mark,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23

每个人都聚集到一行(此时也不知道如何处理标题,欢迎提出建议。)

【问题讨论】:

    标签: python r excel reshape2 data-manipulation


    【解决方案1】:

    假设所有要在同名下聚合的行都是连续的,这个 Python 脚本

    from itertools import groupby
    
    with open('infile.txt') as in_f, open('outfile.txt', 'w') as out_f:
        next(in_f)  # skip header
        aggr = groupby(in_f, lambda line: line.partition(',')[0])
        for k, lines in aggr:
            slines = (l.lstrip(k+',').rstrip() for l in lines)
            out_line = k+','+','.join(slines)+'\n'
            out_f.write(out_line)
    

    成功了。

    例如,输入文件为

    name,time_in,time_out
    jim,1/1/2000 08:24,1/1/2000 15:24
    jim,1/2/2000 08:13,1/2/2000 16:24
    jim,1/3/2000 08:14,1/3/2000 15:25
    jim,1/4/2000 08:33,1/4/2000 16:23
    linda,1/1/2000 08:24,1/1/2000 15:24
    mark,1/2/2000 08:13,1/2/2000 16:24
    mark,1/3/2000 08:14,1/3/2000 15:25
    mark,1/4/2000 08:33,1/4/2000 16:23
    

    它产生一个输出文件

    jim,1/1/2000 08:24,1/1/2000 15:24,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23
    linda,1/1/2000 08:24,1/1/2000 15:24
    mark,1/2/2000 08:13,1/2/2000 16:24,1/3/2000 08:14,1/3/2000 15:25,1/4/2000 08:33,1/4/2000 16:23
    

    它利用了itertools.groupby 的力量

    基本上,只要前缀(即名称)不变,它就会一直对行进行分组。当它继续前进时,在新找到的前缀上创建另一个组。 然后它将每个组的元素简单地连接在一行上,用','分隔

    注意:如果您希望标题出现在输出文件中,请更改行

        next(in_f)  # skip header
    

        out_f.write(next(in_f))  # write and skip header
    

    【讨论】:

      【解决方案2】:

      考虑这个基本的 R 解决方案,它对不同的名称使用运行计数,并按计数从长到宽重塑:

      # RECREATING DATA FRAME
      df <- data.frame(name = c("Jim", "Jim", "Jim", "Jim", "linda", "mark", "mark", "mark"),
             time_in = c("1/1/2000 8:24", "1/2/2000 08:13", "1/3/2000 08:14", "1/4/2000 08:33",
                         "1/1/2000 08:24", "1/2/2000 08:13", "1/3/2000 08:14", "1/4/2000 08:33"),
             time_out = c("1/1/2000 15:24", "1/2/2000 16:24", "1/3/2000 15:25", "1/4/2000 16:23",
                          "1/1/2000 15:24", "1/2/2000 16:24", "1/4/2000 15:25", "1/4/2000 16:23"))
      
      # COUNTING BY GROUPED NAMES
      df$numcount <- sapply(1:nrow(df),
                            function(i) sum(df[1:i, c("name")] == df$name[i]))
      
      # RESHAPING LONG TO WIDE
      reshapedf <- reshape(df, v.names = c("time_in", "time_out"), 
                                 timevar=c("numcount"), idvar = c("name"), 
                                 direction = "wide")
      
      row.names(reshapedf) <- NULL
      
      reshapedf
      

      输出

         name      time_in.1     time_out.1      time_in.2     time_out.2      time_in.3     time_out.3      time_in.4     time_out.4
      1   Jim  1/1/2000 8:24 1/1/2000 15:24 1/2/2000 08:13 1/2/2000 16:24 1/3/2000 08:14 1/3/2000 15:25 1/4/2000 08:33 1/4/2000 16:23
      2 linda 1/1/2000 08:24 1/1/2000 15:24           <NA>           <NA>           <NA>           <NA>           <NA>           <NA>
      3  mark 1/2/2000 08:13 1/2/2000 16:24 1/3/2000 08:14 1/4/2000 15:25 1/4/2000 08:33 1/4/2000 16:23           <NA>           <NA>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 2018-06-05
        • 2015-10-14
        • 2018-09-24
        相关资源
        最近更新 更多