Давайте рассмотрим следующий фрейм данных
library(dplyr)
d <- data.frame(v1 = c("a","a","b","b"), v2 = c("X","Y","Y","X"))
Для группы «a» столбец v2 находится в порядке (X, Y), который я считаю правильным. В противоположность группе «b» порядок неверен (Y, X).
Используя dplyr и функцию do (), я могу проверить для каждой группы, правильный порядок или нет:
filter_fn <- function(my_row){
iX <- filter(my_row, v2 == "X")$i
iY <- filter(my_row, v2 == "Y")$i
res <- as.logical(iX < iY)
return(data.frame(res))
}
d %>%
group_by(v1) %>%
dplyr::mutate(i = row_number()) %>%
do(filter_fn(.)) %>%
ungroup()
Но чтобы избежать умножения функций, я хочу, чтобы logi c записывался непосредственно в цепочку dplyr. Я пробовал использовать group_map и group_modify:
d %>%
group_by(v1) %>%
dplyr::mutate(i = row_number()) %>%
group_map( ~ {
filter(.$v2 == "X")$i < filter(.$v2 == "Y")$i
})
Но, видимо, мое понимание group_map неверно. В документации я не вижу, как функцию можно использовать в do (.) Без предварительного определения как функции как таковой.
Ожидаемым результатом будет следующий фрейм данных
v1 res
a TRUE
b FALSE