R 计算频率和从长到宽转换的更快方法

R 计算频率和从长到宽转换的更快方法,r,aggregate,plyr,reshape2,R,Aggregate,Plyr,Reshape2,我试图获得两个变量“周”和“id”的水平组合的计数。我希望结果以“id”作为行,“week”作为列,计数作为值 到目前为止我已经尝试过的示例(尝试了一系列其他事情,包括添加一个虚拟变量=1,然后在此基础上添加fun.aggregate=sum): 但是,我一定是做错了什么,因为这个函数没有完成。有更好的方法吗 输入: id week 1 1 1 2 1 3 1 1 2 3 输出: 1 2 3 1 2 1 1 2

我试图获得两个变量“周”和“id”的水平组合的计数。我希望结果以“id”作为行,“week”作为列,计数作为值

到目前为止我已经尝试过的示例(尝试了一系列其他事情,包括添加一个虚拟变量=1,然后在此基础上添加
fun.aggregate=sum
):

但是,我一定是做错了什么,因为这个函数没有完成。有更好的方法吗

输入:

id      week
1       1
1       2
1       3
1       1
2       3
输出:

  1  2  3
1 2  1  1
2 0  0  1

对此,您不需要
ddply
。来自重塑2的
dcast
已足够:

dat <- data.frame(
    id = c(rep(1, 4), 2),
    week = c(1:3, 1, 3)
)

library(reshape2)
dcast(dat, id~week, fun.aggregate=length)

  id 1 2 3
1  1 2 1 1
2  2 0 0 1

您可以只使用
命令:

table(data$id,data$week)

    1 2 3
  1 2 1 1
  2 0 0 1
如果“id”和“week”是数据框中唯一的列,您可以简单地使用:

table(data)
#    week
# id  1 2 3
#   1 2 1 1
#   2 0 0 1
library(data.table) 
dcast(setDT(data), id ~ week)
# Using 'week' as value column. Use 'value.var' to override
# Aggregate function missing, defaulting to 'length'
#    id 1 2 3
# 1:  1 2 1 1
# 2:  2 0 0 1

ddply
花费如此长时间的原因是,按组进行的拆分不是并行运行的(只有“拆分”上的计算),因此对于大量的组来说,它将是缓慢的(并且
.parallel=T
)将没有帮助

使用
data.table::dcast
data.table
version>=1.9.2)的方法在时间和内存方面应该非常高效。在这种情况下,我们可以依赖默认参数值,只需使用:

table(data)
#    week
# id  1 2 3
#   1 2 1 1
#   2 0 0 1
library(data.table) 
dcast(setDT(data), id ~ week)
# Using 'week' as value column. Use 'value.var' to override
# Aggregate function missing, defaulting to 'length'
#    id 1 2 3
# 1:  1 2 1 1
# 2:  2 0 0 1
或者显式设置参数:

dcast(setDT(data), id ~ week, value.var = "week", fun = length)
#    id 1 2 3
# 1:  1 2 1 1
# 2:  2 0 0 1


有关pre-
数据。表
1.9.2备选方案,请参见编辑。

A
tidyverse
选项可以是:

library(dplyr)
library(tidyr)

df %>%
  count(id, week) %>%
  pivot_wider(names_from = week, values_from = n, values_fill = list(n = 0))
  #spread(week, n, fill = 0) #In older version of tidyr

#     id   `1`   `2`   `3`
#   <dbl> <dbl> <dbl> <dbl>
#1     1     2     1     1
#2     2     0     0     1
数据

df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L), week = c(1L, 2L, 3L, 
1L, 3L)), class = "data.frame", row.names = c(NA, -5L))

df+1爆炸。你有本事让我的解决方案看起来非常冗长、迂回和平淡。如果你有很多数据和操作无法简化,那么“data.table”包可能会帮助你。
df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L), week = c(1L, 2L, 3L, 
1L, 3L)), class = "data.frame", row.names = c(NA, -5L))