猿问

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

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

我试图获得两个变量“周”和“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


慕容708150
浏览 749回答 4
4回答

largeQ

你不需要ddply为了这个。这个dcast从…reshape2就足够了:dat <- data.frame(&nbsp; &nbsp; id = c(rep(1, 4), 2),&nbsp; &nbsp; week = c(1:3, 1, 3))library(reshape2)dcast(dat, id~week, fun.aggregate=length)&nbsp; id 1 2 31&nbsp; 1 2 1 12&nbsp; 2 0 0 1编辑:对于基本R解(不包括table-如约书亚·尤利希所发),试一试xtabs:xtabs(~id+week, data=dat)&nbsp; &nbsp;weekid&nbsp; 1 2 3&nbsp; 1 2 1 1&nbsp; 2 0 0 1

慕田峪7331174

你可以用table指挥:table(data$id,data$week) &nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;2&nbsp;3 &nbsp;&nbsp;1&nbsp;2&nbsp;1&nbsp;1 &nbsp;&nbsp;2&nbsp;0&nbsp;0&nbsp;1如果“id”和“Week”是数据框架中的唯一列,则只需使用:table(data)#&nbsp;&nbsp;&nbsp;&nbsp;week#&nbsp;id&nbsp;&nbsp;1&nbsp;2&nbsp;3#&nbsp;&nbsp;&nbsp;1&nbsp;2&nbsp;1&nbsp;1#&nbsp;&nbsp;&nbsp;2&nbsp;0&nbsp;0&nbsp;1

守着星空守着你

一些tidyverse备选方案:library(tidyverse)df&nbsp;%>% &nbsp;&nbsp;count(id,&nbsp;week)&nbsp;%>% &nbsp;&nbsp;spread(week,&nbsp;n,&nbsp;fill&nbsp;=&nbsp;0)#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;&nbsp;&nbsp;`1`&nbsp;&nbsp;&nbsp;`2`&nbsp;&nbsp;&nbsp;`3`#&nbsp;&nbsp;&nbsp;<dbl>&nbsp;<dbl>&nbsp;<dbl>&nbsp;<dbl>#1&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1#2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1或分组,数行数,然后展开df&nbsp;%>% &nbsp;&nbsp;group_by(id,&nbsp;week)&nbsp;%>%&nbsp;#OR&nbsp;group_by_all() &nbsp;&nbsp;summarise(count&nbsp;=&nbsp;n())&nbsp;%>% &nbsp;&nbsp;spread(week,&nbsp;count,&nbsp;fill&nbsp;=&nbsp;0)
随时随地看视频慕课网APP
我要回答