使用dplyr mutate在组中查找第一次出现的值

时间:2015-03-26 07:27:54

标签: r dplyr

如何使用dplyr在组内找到特定值的第一个出现。

以下代码给出了所需的结果,但我想知道是否有更短的方法。

另外,我担心group_bymutate或其他一些功能可能会对行进行隐式重新排列,不知道这是否可能是个问题?

mtcars   %>% select( cyl, carb) %>% group_by( cyl ) %>%

   mutate( "occurence_of_4" =  carb == 4 )  %>%

   dplyr::arrange( cyl )  %>%

   group_by( cyl, occurence_of_4)  %>%

   mutate( "count" = 1:n(),
           "first_4_in_cyl_group"  = ifelse( occurence_of_4==TRUE & count==1, TRUE, FALSE)) 

第一次出现" 4"变量first_4_in_cyl_group为TRUE。在每个圆柱组中,FALSE否则:

Source: local data frame [32 x 5]
Groups: cyl, occurence_of_4

   cyl carb occurence_of_4 count first_4_in_cyl_group
1    4    1          FALSE     1                FALSE
2    4    2          FALSE     2                FALSE
3    4    2          FALSE     3                FALSE
4    4    1          FALSE     4                FALSE
5    4    2          FALSE     5                FALSE
6    4    1          FALSE     6                FALSE
7    4    1          FALSE     7                FALSE
8    4    1          FALSE     8                FALSE
9    4    2          FALSE     9                FALSE
10   4    2          FALSE    10                FALSE
11   4    2          FALSE    11                FALSE
12   6    4           TRUE     1                 TRUE
13   6    4           TRUE     2                FALSE
14   6    1          FALSE     1                FALSE
15   6    1          FALSE     2                FALSE
16   6    4           TRUE     3                FALSE
17   6    4           TRUE     4                FALSE
18   6    6          FALSE     3                FALSE
19   8    2          FALSE     1                FALSE
20   8    4           TRUE     1                 TRUE
21   8    3          FALSE     2                FALSE
22   8    3          FALSE     3                FALSE
23   8    3          FALSE     4                FALSE
24   8    4           TRUE     2                FALSE
25   8    4           TRUE     3                FALSE
26   8    4           TRUE     4                FALSE
27   8    2          FALSE     5                FALSE
28   8    2          FALSE     6                FALSE
29   8    4           TRUE     5                FALSE
30   8    2          FALSE     7                FALSE
31   8    4           TRUE     6                FALSE
32   8    8          FALSE     8                FALSE

3 个答案:

答案 0 :(得分:6)

您可以使用!duplicated

mtcars %>%
  select(cyl, carb) %>%
  group_by(cyl) %>%
  mutate(first_4 = carb == 4 & !duplicated(carb == 4))  %>%
  arrange(cyl)

答案 1 :(得分:3)

一些修改:

  1. 通过创建" occurence_of_4"删除第一个mutate步骤group_by
  2. 中的变量
  3. ifelse不需要,因为输出将是" TRUE / FALSE"

    library(dplyr)
    mtcars %>%
         select(cyl, carb) %>%
         group_by(cyl, occurence_of_4= carb==4) %>% 
         arrange(cyl) %>%
         mutate(count= row_number(), 
             first_4_in_cyl_group = occurence_of_4 & count==1)
    

答案 2 :(得分:1)

而不是分组它足以通过cyl和carb安排。有了滞后,你可以检查以前的值。

mtcars数据库没有ID列,因此如果要重新排列行,可以使用add_rownames添加它们(如注释中建议的docendodiscimus)。

mtcars   %>% 
  select( cyl, carb ) %>%
  add_rownames() %>%
  arrange(cyl, carb) %>%
  mutate(
    isfirst = (carb == 4 & (is.na(lag(carb)) | lag(carb) != 4))) %>%
  filter(isfirst)

结果:

#      rowname cyl carb isfirst
# 1  Mazda RX4   6    4    TRUE
# 2 Duster 360   8    4    TRUE