想要计算数据框中变量的出现次数。在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可以很容易地像这样:
我尝试了一些线路,但仍然没有到达那里。
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数据透视表相同输出的方法是什么?谢谢。
我们可以使用正则表达式删除时间组件(首选方法是使用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的代码不起作用的原因是在转换为Date
之后,它没有被分配给'v_time'
最困难的部分就是将日期组件从列中取出。
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