为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

慕容708150 2019-06-01 10:46:18

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

我试图获得两个变量“周”和“id”的每个级别的计数。我希望结果有“id”作为行,“Week”作为列,并将其算作值。


到目前为止我尝试过的例子(尝试了许多其他事情,包括添加一个虚拟变量=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


查看完整描述

4 回答

?
largeQ

你不需要ddply为了这个。这个dcast从…reshape2就足够了:


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-如约书亚·尤利希所发),试一试xtabs:


xtabs(~id+week, data=dat)


   week

id  1 2 3

  1 2 1 1

  2 0 0 1


查看完整回答
反对 回复 2019-06-01
?
慕田峪7331174

你可以用table指挥:

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


查看完整回答
反对 回复 2019-06-01
?
皈依舞

原因ddply花了这么长时间,按组进行的分裂不是并行运行的(只有在“拆分”上的计算),因此,对于大量的组,它将是缓慢的(和.parallel = T)不会有帮助的。

一种使用data.table::dcast (data.table版本>=1.9.2)在时间和内存方面应该非常有效。在这种情况下,我们可以依赖缺省参数值,只需使用:

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.table1.9.2备选案文,见编辑。


查看完整回答
反对 回复 2019-06-01
?
守着星空守着你

一些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)


查看完整回答
反对 回复 2019-06-01

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信