【问题标题】:R: Identifying rows by group based on value in row above/belowR:根据上/下行中的值按组识别行
【发布时间】:2019-09-13 18:15:48
【问题描述】:

我有一个包含两列的数据框:一个标识符和某个事件的发生。我想做的是确定某件事是否先于其他事情发生。

例如:在下表中,如果存在 ID 在咖啡前订购蛋糕的任何实例,我想生成一个放置 TRUE/FALSE 或 1/0 的列:

ID<-c(4,4,5,5,6,6,6,7,7,8,9,9,9)

Order<-c("coffee","cake","coffee","cake","coffee",
"cake","coffee","cake","coffee","coffee","coffee","cake", "cake")

orders<-data.frame(ID, Order)

预期输出:

  ID  Order Marker
   4 coffee      0
   4   cake      0
   5 coffee      0
   5   cake      0
   6 coffee      1
   6   cake      1
   6 coffee      1
   7   cake      1
   7 coffee      1
   8 coffee      0
   9 coffee      0
   9   cake      0
   9   cake      0

我认为解决方案需要ifelse 语句,但我不确定如何引用下面的行或行+1。非常感谢任何帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    OrderID 分组,将cakecoffee 的值作为子集,并检查两者中的第一个。

    +(ave(Order, ID, FUN = function(x) x[x %in% c("cake", "coffee")][1]) == "cake")
    # [1] 0 0 0 0 0 0 0 1 1 0 0 0 0
    

    【讨论】:

      【解决方案2】:

      按“ID”分组后的选项是match,它获取第一个匹配项的索引并检查它是否等于1

      library(dplyr)
      orders %>%
            group_by(ID) %>%
            mutate(Marker = + (match('cake', Order, nomatch = 0) == 1))
      # A tibble: 13 x 3
      # Groups:   ID [6]
      #      ID Order  Marker
      #   <dbl> <fct>   <int>
      # 1     4 coffee      0
      # 2     4 cake        0
      # 3     5 coffee      0
      # 4     5 cake        0
      # 5     6 coffee      0
      # 6     6 cake        0
      # 7     6 coffee      0
      # 8     7 cake        1
      # 9     7 coffee      1
      #10     8 coffee      0
      #11     9 coffee      0
      #12     9 cake        0
      #13     9 cake        0
      

      或者子集可以做检查

      orders %>%
          group_by(ID) %>% 
          mutate(Marker = first(Order) == 'cake')
      

      【讨论】:

      • 您的两个选项都运行良好,但您的第二个选项是我使用的那个,非常优雅的解决方案和简单我很惭愧我没有想到以这种方式处理它,即确定第一个独特的价值集。感谢您的帮助和时间。
      猜你喜欢
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 2019-08-07
      • 2017-04-10
      • 2018-12-18
      • 2019-02-24
      • 2021-09-11
      • 2020-02-19
      相关资源
      最近更新 更多