如何使用dplyr为二进制状态分配顺序标识?
我试图分析物体在三种可能状态之间移动时的一些信息。数据的布局应确保每个状态都有自己的列,并按顺序排列二进制值,例如如何使用dplyr为二进制状态分配顺序标识?,r,dplyr,R,Dplyr,我试图分析物体在三种可能状态之间移动时的一些信息。数据的布局应确保每个状态都有自己的列,并按顺序排列二进制值,例如 df这有点复杂,因为您需要做两件事并将它们结合起来: 给定行中哪个状态处于活动状态 每个州现在有多少次处于活动状态 (合并)激活状态已激活多少次 我认为最终实现这一点的方法是重塑数据,并使用两个分组来获得您想要的: 按行分组并使用哪个来计算处于活动状态的状态号 按状态分组,并使用cumsum获取每次状态变为活动状态时都会上升的索引 然后组合,filter,只保留与每个rowid的相
df这有点复杂,因为您需要做两件事并将它们结合起来:
给定行中哪个状态处于活动状态
每个州现在有多少次处于活动状态
(合并)激活状态已激活多少次
我认为最终实现这一点的方法是重塑数据,并使用两个分组来获得您想要的:
按行分组并使用哪个
来计算处于活动状态的状态号
按状态分组,并使用cumsum
获取每次状态变为活动状态时都会上升的索引
然后组合,filter
,只保留与每个rowid
的相关列对应的行,并将右键连接到原始数据上
特别是第二项任务,我认为如果不重新塑造或处理数量庞大的列,就很难实现
库(tidyverse)
df%
排列(状态,行ID)%>%
分组依据(rowid)%>%
变异(state_num=which(binary==1))%>%
按(州)分组%>%
变异(
state\u col\u num=str\u remove(state,“state”)%%>%as.integer(),
序列=cumsum(二进制==1&lag(二进制,默认=0)==0)
) %>%
解组()%>%
筛选器(state\u num==state\u col\u num)%>%
unite(“state.id”,state_num,sep=“.”)%>%
右键联接(df,by=“rowid”)%>%
选择(rowid,匹配(“状态(\\d+\\\.id)”)
#>#tibble:11 x 5
#>rowid state.id state1 state2 state3
#>
#> 1 1 2.1 0 1 0
#> 2 2 2.1 0 1 0
#> 3 3 2.1 0 1 0
#> 4 4 1.1 1 0 0
#> 5 5 1.1 1 0 0
#> 6 6 2.2 0 1 0
#> 7 7 2.2 0 1 0
#> 8 8 1.2 1 0 0
#> 9 9 2.3 0 1 0
#> 10 10 3.1 0 0 1
#> 11 11 3.1 0 0 1
由(v0.3.0)创建于2019-08-07我们可以使用max.col
获得每行的最大数量(temp
)。我们还使用row_number()
创建一个新列,在每个temp
中创建一个顺序计数器,如果行数的差值大于1,该计数器将递增
library(dplyr)
df %>%
mutate(temp = max.col(.),
row = row_number()) %>%
group_by(temp) %>%
mutate(temp1 = cumsum(row - lag(row, default = first(row)) > 1) + 1,
state.id = paste(temp, temp1, sep = ".")) %>%
ungroup %>%
select(-temp, -temp1, -row)
# A tibble: 11 x 4
# state1 state2 state3 state.id
# <dbl> <dbl> <dbl> <chr>
# 1 0 1 0 2.1
# 2 0 1 0 2.1
# 3 0 1 0 2.1
# 4 1 0 0 1.1
# 5 1 0 0 1.1
# 6 0 1 0 2.2
# 7 0 1 0 2.2
# 8 1 0 0 1.2
# 9 0 1 0 2.3
#10 0 0 1 3.1
#11 0 0 1 3.1
库(dplyr)
df%>%
突变(温度=最大列(.),
行=行编号())%>%
分组依据(温度)%>%
mutate(temp1=cumsum(row-lag(row,default=first(row))>1)+1,
state.id=粘贴(温度、温度1、九月“”)%>%
解组%>%
选择(-temp,-temp1,-行)
#一个tibble:11 x 4
#state1 state2 state3 state.id
#
# 1 0 1 0 2.1
# 2 0 1 0 2.1
# 3 0 1 0 2.1
# 4 1 0 0 1.1
# 5 1 0 0 1.1
# 6 0 1 0 2.2
# 7 0 1 0 2.2
# 8 1 0 0 1.2
# 9 0 1 0 2.3
#10 0 0 1 3.1
#11 0 0 1 3.1
Hey这在几天之前一直很有效,但在重新运行代码(包括上面的可复制示例)时,我遇到了一个问题。似乎row\u number()
函数不再正常工作,正在寻找参数。我得到的错误消息是:df%>%+mutate(temp=max.col(.),+row=row_number())错误:row_number()应该只在数据上下文中调用
过去似乎其他人在R试图调用dplyr::row_number()而不是基本版本时遇到问题(前者需要论证,后者不需要)——这可能有关系吗?@comcco它对我仍然有效。你使用的是什么版本的dplyr
?我有packageVersion(“dplyr”)#[1]“0.8.1”
。我有0.8.3。我仍在研究这个问题,但它一直要求一个参数-我还试图找出如何为它提供创建临时行所需的临时行组件counter@comcco您是否已将plyr
与dplyr
一起加载?plyr
也有mutate
在这里可能会被屏蔽。您可以在使用mutate
的任何地方明确提到dplyr::mutate
,然后检查结果。