Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用dplyr mutate查找组中第一个出现的值_R_Dplyr - Fatal编程技术网

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

使用dplyr mutate查找组中第一个出现的值,r,dplyr,R,Dplyr,如何使用dplyr在组中查找某个值的首次出现 下面的代码给出了所需的结果,但我想知道是否有一个更短的方法来实现它 另外,我担心group\u by或mutate,或其他函数可能会隐式重新排列行,不知道这是否是一个问题 mtcars %>% select( cyl, carb) %>% group_by( cyl ) %>% mutate( "occurence_of_4" = carb == 4 ) %>% dplyr::arrange( cyl

如何使用
dplyr
在组中查找某个值的首次出现

下面的代码给出了所需的结果,但我想知道是否有一个更短的方法来实现它

另外,我担心
group\u by
mutate
,或其他函数可能会隐式重新排列行,不知道这是否是一个问题

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_为
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

一些修改:

  • 通过在
    group\u by
  • ifelse
    不需要,因为输出将为“真/假”


  • 而不是分组它是足够的安排由共青团和碳水化合物。使用lag可以检查上一个值

    mtcars数据库没有ID列,所以如果要重新排列行,可以使用add_rownames添加行(正如DocendDiscimus在注释中建议的那样)

    结果是:

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

    您可以使用
    !重复的

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

    您缺少重现所需结果所需的分组,否?@docendodiscimus我不确定为什么使用分组。可能我不理解所需的输出,但在我看来,排列应该足够了。将代码的输出与所需结果的最后一列进行比较。如果按cyl和carb排列,您的代码生成的真实条目比预期的多。编辑是可以的。您是对的。(+1)顺便说一句,你可以在dplyr链中使用
    添加行名(“id”)
    。喜欢这个-对用例(和我的用例)来说非常有效。当您已经将要查找的第一个项作为逻辑值时,它会非常干净。
    #      rowname cyl carb isfirst
    # 1  Mazda RX4   6    4    TRUE
    # 2 Duster 360   8    4    TRUE
    
    mtcars %>%
      select(cyl, carb) %>%
      group_by(cyl) %>%
      mutate(first_4 = carb == 4 & !duplicated(carb == 4))  %>%
      arrange(cyl)