更快的方法计算频率和流延从长到宽

问题描述 投票:7回答:4

我想获得的,“周”和“ID”两个变量水平的每个组合的计数。我想结果有“身份证”作为行,“本周”栏目,和计数的值。

的我到目前为止已经试过实施例(尝试了一堆其他东西,包括添加伪变量= 1,然后在fun.aggregate = sum那个):

library(plyr)
ddply(data, .(id), dcast, id ~ week, value_var = "id", 
        fun.aggregate = length, fill = 0, .parallel = TRUE)

但是,我必须做一些错误的,因为此功能未完成。有一个更好的方法吗?

输入:

id      week
1       1
1       2
1       3
1       1
2       3

输出:

  1  2  3
1 2  1  1
2 0  0  1
r aggregate plyr reshape2
4个回答
13
投票

你不需要ddply这一点。从dcastreshape2是足够了:

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

编辑:对于基础R溶液(比table其他 - 张贴由Joshua Uhlrich),尝试xtabs

xtabs(~id+week, data=dat)

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

19
投票

你可以只使用table命令:

table(data$id,data$week)

    1 2 3
  1 2 1 1
  2 0 0 1

如果“id”和“周”是在数据帧的唯一列,您可以简单地使用:

table(data)
#    week
# id  1 2 3
#   1 2 1 1
#   2 0 0 1

10
投票

ddply之所以这么长时间是由一群分裂没有以并行方式(只计算上的“分裂”)有大量团体经营,因此这将是缓慢的(和.parallel = T)也无济于事。

一个(data.table::dcast版本> = 1.9.2),使用data.table方法应该是在时间和内存效率极高。在这种情况下,我们可以依靠默认参数值,只需使用:

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

对于data.table预1.9.2的替代品,看看编辑。


1
投票

很少tidyverse选项:

library(tidyverse)

df %>%
  count(id, week) %>%
  spread(week, n, fill = 0)

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

或分组,计算行数,然后蔓延

df %>%
  group_by(id, week) %>% #OR group_by_all()
  summarise(count = n()) %>%
  spread(week, count, fill = 0)
© www.soinside.com 2019 - 2024. All rights reserved.