代码之家  ›  专栏  ›  技术社区  ›  Mark K

R、 统计Excel数据透视表等变量的出现次数

  •  2
  • Mark K  · 技术社区  · 6 年前

    要计算数据帧中变量的出现次数。在Excel数据透视表中很容易做到这一点,现在学习如何在R中做到这一点。

          v_time visitor
    1/2/2018 16:07    Jack
    1/3/2018 16:09    Jack
    1/3/2018 16:12   David
    1/3/2018 16:16    Kate
    1/2/2018 16:21   David
    1/2/2018 16:32    Jack
    1/4/2018 16:33    Kate
    1/4/2018 16:55    Jack
    

    Excel可以这样轻松实现:

    enter image description here

    我试过一些台词,但仍然没有达到目的。

    visitor <- c("Jack", "Jack", "David", "Kate", "David", "Jack", "Kate", "Jack")
    v_time <- c("1/2/2018 16:07","1/3/2018 16:09","1/3/2018 16:12","1/3/2018 16:16","1/2/2018 16:21","1/2/2018 16:32","1/4/2018 16:33", "1/4/2018 16:55")
    df <- data.frame(v_time, visitor)
    
    as.Date(as.POSIXct(df$v_time, "%m/%d/%Y"))
    
    library(plyr)
    count(df$visitor, 'v_time')
    
    as.data.frame(table(df$visitor))
    

    如何在R中生成类似Excel数据透视表的输出?非常感谢。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Hugh    6 年前

    最困难的部分是从列中去掉“日”部分。

    library(data.table)
    dcast(setDT(df)[, day := sub(" .*$", "", v_time)], visitor ~ day, fun.aggregate = length)
    #> Using 'day' as value column. Use 'value.var' to override
    #>    visitor 1/2/2018 1/3/2018 1/4/2018
    #> 1:   David        1        1        0
    #> 2:    Jack        2        1        1
    #> 3:    Kate        0        1        1
    
        2
  •  2
  •   akrun    6 年前

    我们可以使用任意一个正则表达式删除时间组件(首选方法是将其转换为 Date 使用类 as.Date

    df$v_time <- sub("\\s+.*", "", df$v_time)
    

    df$v_time <- as.Date(df$v_time, "%m/%d/%Y")
    

    然后做 table

    as.data.frame.matrix(table(df[2:1]))
    

    如果我们需要 sum 在两个页边距上,使用 addmargins

    addmargins(table(df[2:1]))
    

    OP代码不工作的原因是在转换为之后 日期 ,未分配给“v\U时间”