如何使用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
    ,然后检查结果。