根据条件查找行

时间:2019-01-15 05:34:22

标签: r

我是R语言的新手,在该特定查询上遇到了一些麻烦

我想查找(顺序)具有类型2(并且必须同时具有两种类型)的人(顺序)

Person | type | order
A1     | 1    | 1
A1     | 1    | 2 
A2     | 2    | 3
A2     | 1    | 4
A2     | 2    | 5 
A3     | 1    | 6
A4     | 1    | 7
A4     | 2    | 8
A5     | 1    | 9
A5     | 1    | 10
A5     | 2    | 11

在此示例中,我将使用A4A5作为答案。

1 个答案:

答案 0 :(得分:1)

您可以创建一个flag来标识Persontype == 1之前出现的type == 2

library(dplyr)

df %>%
  group_by(Person) %>%
  summarise(flag = which.max(type == 1) < which.max(type == 2))

# Person     flag 
#  <fct>     <lgl>
#1  A1      FALSE
#2  A2      FALSE
#3  A3      FALSE
#4  A4      TRUE 
#5  A5      TRUE 

对基数R aggregate使用相同的逻辑

df1 <- aggregate(type~Person, df, function(x) which.max(x == 1) < which.max(x == 2))

df1
# Person  type
#1 A1      FALSE
#2 A2      FALSE
#3 A3      FALSE
#4 A4       TRUE
#5 A5       TRUE

然后可以子集type来获得People

df1$Person[df1$type]
#[1] "A4"  "A5"

使用基数R ave

的另一种方法
unique(df$Person[as.logical(with(df, 
   ave(type, Person, FUN = function(x) which.max(x == 1) < which.max(x == 2))))])
#[1] "A4" "A5"