使用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)