首页 > 解决方案 > 根据多个条件选择单行

问题描述

标签: rlagrankinglead

解决方案


一种dplyr可能是:

df %>%
 group_by(seq) %>%
 mutate(choose = +(match == "y") * (cumsum(match == "y") == 1))

  seq   rank  match choose
  <fct> <fct> <fct>  <int>
1 A     1     y          1
2 A     2     n          0
3 A     3     y          0
4 B     1     n          0
5 B     2     n          0
6 B     3     y          1
7 B     4     y          0

如果你想有 TRUE/FALSE 值:

df %>%
 group_by(seq) %>%
 mutate(choose = as.logical(+(match == "y") * (cumsum(match == "y") == 1)))

  seq   rank  match choose
  <fct> <fct> <fct> <lgl> 
1 A     1     y     TRUE  
2 A     2     n     FALSE 
3 A     3     y     FALSE 
4 B     1     n     FALSE 
5 B     2     n     FALSE 
6 B     3     y     TRUE  
7 B     4     y     FALSE

和同样的base R

with(df, ave(match, seq, FUN = function(x) +(x == "y") * (cumsum(x == "y") == 1)))

或者:

with(df, ave(match, seq, FUN = function(x) as.logical(+(x == "y") * (cumsum(x == "y") == 1))))

推荐阅读