R:根据上/下行中的值按组识别行

Posted

技术标签:

【中文标题】R:根据上/下行中的值按组识别行【英文标题】:R: Identifying rows by group based on value in row above/below 【发布时间】: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。非常感谢任何帮助。

【问题讨论】:

【参考方案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')

【讨论】:

您的两个选项都运行良好,但您的第二个选项是我使用的那个,非常优雅的解决方案和简单我很惭愧我没有想到以这种方式处理它,即确定第一个独特的价值集。感谢您的帮助和时间。

以上是关于R:根据上/下行中的值按组识别行的主要内容,如果未能解决你的问题,请参考以下文章

如果名称按组的顺序不同,R data.table 分组操作返回错误值?

R中的按组组合

Power BI按组检索最后一列的值

用 R 中的多列按组计算百分比

Pandas按组内的值分组和排序[重复]

在 R 中按组转置数据