R 按ID划分的轨迹频率
我知道有数百个关于如何计数的问题和答案,但我真的找不到解决问题的办法,我的想法也没有了 我有一组轨迹,例如纵向数据,每个周期都有一个值。如果所有的值按id相同,我需要获得特定轨迹的计数R 按ID划分的轨迹频率,r,dplyr,count,sum,duplicates,R,Dplyr,Count,Sum,Duplicates,我知道有数百个关于如何计数的问题和答案,但我真的找不到解决问题的办法,我的想法也没有了 我有一组轨迹,例如纵向数据,每个周期都有一个值。如果所有的值按id相同,我需要获得特定轨迹的计数 mydata <- data.frame(id=rep(1:8, each = 4), time=rep(1:4, 8), value=c(1,1,2,2,1,2,3,4,1,1,2,2,1,2,2,3,1,3,4,4,1,2,3
mydata <- data.frame(id=rep(1:8, each = 4), time=rep(1:4, 8),
value=c(1,1,2,2,1,2,3,4,1,1,2,2,1,2,2,3,1,3,4,4,1,2,3,4,1,2,2,2,1,1,2,2))
desired_output <- data.frame(id=rep(c("1_3_8","2_6","4","5","7"),each = 4), time=rep(1:4, 5),
value=c(1,1,2,2, 1,2,3,4, 1,2,2,3, 1,3,4,4, 1,2,2,2),
weight = c(3,3,3,3, 2,2,2,2, 1,1,1,1,1,1,1,1,1,1,1,1 ))
mydata我已经在下面的reprex中写下了我将如何做,但是我想我的解决方案有很多步骤,其中一部分是将其转换为所需的输出形式。(解决方案可能是这些行的子集中所需的形式,因此我建议您一次运行一行代码以进行检查)
重新排列行,使时间成为列,使完整轨迹只占用一行(使用pivot\u wider()
完成)
将轨迹组合成字符串(即每个轨迹都是唯一定义的)。我使用了unite()
函数来实现这一点
按轨迹分组并计算每条轨迹的数量。我使用了groupby()
和n()来实现这一点
嵌套数据帧以收集ID(使用Nest
)
将匹配轨迹列表转换为ID字符串
使用mutates和unnest将数据转换回长格式(使用unnest
和字符串操作函数)
将时间加回,因为轨迹保持在每个唯一轨迹的顺序中
库(tidyverse)
mydata%
pivot\u Widther(id\u cols=id,names\u from=time,values\u from=value)%>%
联合(列=轨迹,-id,sep=“/”)%>%
分组依据(轨迹)%>%
变异(权重=n())%>%
嵌套(id)%>%
解组()%>%
变异(id=map\u chr(数据,~paste(.x$id,collapse=“\u”)))%>%
突变(轨迹=str_分割(轨迹,“/”)%>%
选择(ID、轨迹、重量)%>%
unnest(c(轨迹))%>%
分组依据(ID)%>%
突变(次数=1:长度(轨迹))
#>#A tibble:20 x 4
#>#组:ID[5]
#>ids轨迹加权时间
#>
#> 1 1_3_8 1 3 1
#> 2 1_3_8 1 3 2
#> 3 1_3_8 2 3 3
#> 4 1_3_8 2 3 4
#> 5 2_6 1 2 1
#> 6 2_6 2 2 2
#> 7 2_6 3 2 3
#> 8 2_6 4 2 4
#> 9 4 1 1 1
#> 10 4 2 1 2
#> 11 4 2 1 3
#> 12 4 3 1 4
#> 13 5 1 1 1
#> 14 5 3 1 2
#> 15 5 4 1 3
#> 16 5 4 1 4
#> 17 7 1 1 1
#> 18 7 2 1 2
#> 19 7 2 1 3
#> 20 7 2 1 4
由(v2.0.0)于2021-04-07创建