代码之家  ›  专栏  ›  技术社区  ›  Houssem Missaoui

如何重置循环?

  •  0
  • Houssem Missaoui  · 技术社区  · 7 年前

    大家好我有这个数据集

    library(dplyr)
    library(tidyr)
    input<- frame_data(
      ~member_id,   ~fill_date   ,  ~drug, ~days_supply, 
      "603",       "02/17/2005",    "a",    30,         
      "603",       "06/13/2005",    "a",    30,       
      "603",       "08/11/2005",    "a",    30,           
      "603",       "06/12/2006",    "b",    15,
      "603",       "05/09/2006",    "b",    30
      )
    

    我试图创建一个名为“time”的变量,它指示变量“drug”出现的时间。所以输出应该如下所示

    output<- frame_data(
      ~member_id,   ~fill_date   ,  ~drug, ~days_supply, ~time,
      "603",       "02/17/2005",    "a",    30,           1,
      "603",       "06/13/2005",    "a",    30,           2,
      "603",       "08/11/2005",    "a",    30,           3,
      "603",       "06/12/2006",    "b",    15,           1,
      "603",       "05/09/2006",    "b",    30            2
      )
    

    换句话说,我在寻找一种循环,它可以在每次“drug”变量更改时重置 我试过这个密码

    time<-1
    i<-2
    j<-1
    while (i <=nrow(input)){
      if (input[i,3,drop=]==input[i-1,3,drop=]){
        j<-i
        time<-c(time,j)
      }else{
        j<-1
        time<-c(time,j)
      }
      i<-i+1
    }
    

    但它当然不起作用,因为无法重置i,因为它在同一时间验证条件时指示行索引。

    谢谢你的帮助

    1 回复  |  直到 7 年前
        1
  •  2
  •   Gregor Thomas    7 年前

    您正在使用 dplyr ,所以使用 group_by ,而不是循环。

    input %>% group_by(drug) %>% mutate(time = 1:n())
    

    可能您想添加 member_id 我也向大家介绍了,但既然你没有提到,我就不包括在内了。如果是这样的话 group_by(drug, member_id) 而不是 group_by(drug) .