使用 dplyr mutate 在组中查找值的第一次出现
Find first occurence of value in group using dplyr mutate
如何使用 dplyr
.
在组中找到某个值的第一次出现
下面的代码给出了想要的结果,但我想知道是否有更短的方法来完成它。
此外,我担心 group_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))
变量first_4_in_cyl_group是TRUE
每个气缸组中第一次出现的“4”,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_by
中创建 "occurence_of_4" 变量删除第一步 mutate
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)
不用分组,按环和碳水化合物排列就足够了。使用滞后,您可以检查以前的值。
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
您可以使用 !duplicated
.
mtcars %>%
select(cyl, carb) %>%
group_by(cyl) %>%
mutate(first_4 = carb == 4 & !duplicated(carb == 4)) %>%
arrange(cyl)
如何使用 dplyr
.
下面的代码给出了想要的结果,但我想知道是否有更短的方法来完成它。
此外,我担心 group_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))
变量first_4_in_cyl_group是TRUE
每个气缸组中第一次出现的“4”,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_by
中创建 "occurence_of_4" 变量删除第一步 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)
mutate
不用分组,按环和碳水化合物排列就足够了。使用滞后,您可以检查以前的值。
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
您可以使用 !duplicated
.
mtcars %>%
select(cyl, carb) %>%
group_by(cyl) %>%
mutate(first_4 = carb == 4 & !duplicated(carb == 4)) %>%
arrange(cyl)