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】:将Order
按ID
分组,将cake
或coffee
的值作为子集,并检查两者中的第一个。
+(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:根据上/下行中的值按组识别行的主要内容,如果未能解决你的问题,请参考以下文章