Проблема
Я пытаюсь создать функцию, использующую синтаксис dplyr
и []
, но неправильно использую предложения. Проблема проистекает из каменистого фундамента с ворсинками и приливом. Я надеюсь, что кто-то может объяснить, почему моя функция не работает.
Фон
Я нашел этот код действительно полезным и хотел превратить его в функцию, с помощью которой я мог бы изменять аргументы без использования строк. Я смог получить эту функцию, используя Программирование с помощью dplyr Vignette . (примечание: я изменил исходный код для удовлетворения своих потребностей)
library(dplyr)
persistence <- function(df, period, ...){
period <- enquo(period)
group_var <- quos(...)
df %>%
group_by(!!! group_var, !! period) %>%
summarise(persistence_rate = length(base::intersect(id, df$id[df$rank==(rank+1)]))/n_distinct(id))
}
Используя данные, которые я предоставил ниже, использование этой функции дает мне желаемый результат:
persistence(data, period)
# A tibble: 5 x 2
period persistence_rate
<chr> <dbl>
1 a 0.500
2 b 1.00
3 c 0.667
4 d 0.667
5 e 0.
К сожалению, когда я пытался изменить столбцы id и rank, я не был уверен, как включить эти предложения.
Что я пробовал
Используя эти данные:
data <- structure(list(id = c("A", "B", "C", "D", "A", "C", "A", "B", "C", "A", "D", "C", "A", "B", "C"),
period = c("a", "a", "a", "a", "b", "b", "c", "c", "c", "d", "d", "d", "e", "e", "e"),
rank = c(1, 1, 1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5),
group = c("g1", "g2", "g1", "g2", "g1", "g1", "g1", "g2", "g1", "g1", "g2", "g1", "g1", "g2", "g1")),
.Names = c("id", "period", "rank", "group"),
row.names = c(NA, -15L),
class = c("tbl_df", "tbl", "data.frame"))
Я закончил с этой функцией:
persistence_new <- function(df, id, period, rank, ...){
period <- enquo(period)
id <- enquo(id)
rank <- enquo(rank)
group_var <- quos(...)
df %>%
group_by(UQS(group_var), UQ(period)) %>%
summarise(persistence_rate = length(base::intersect(UQ(id), UQ(id)[UQ(rank) == (UQ(rank) + 1)]))/n_distinct(UQ(id)))
}
Что дает мне этот результат:
persistence_new(data, id, period, rank)
# A tibble: 5 x 2
period persistence_rate
<chr> <dbl>
1 a 0.
2 b 0.
3 c 0.
4 d 0.
5 e 0.
Мне потребовалось много времени, чтобы понять это. Поскольку я пробовал разные вещи, это часто приводило к ошибке. Теперь он работает, но не дает мне желаемых результатов.
Я, по сути, пробовал каждую итерацию ()
, UQ
, []
и [[]]
, о которой я мог подумать.
Спасибо
Я надеюсь узнать больше о tidyeval, чтобы у меня не было таких трудных времен с этим в будущем. Учитывая сказанное и учитывая, что проблема заключается в отсутствии понимания, я был бы признателен за любые точки зрения на , почему моя текущая функция не работает. Любое понимание того, как сделать тидевал более интуитивным, было бы замечательно.
В качестве альтернативы, не стесняйтесь указывать мне на конкретный раздел Программирование с помощью dplyr Vignette. Я проработал все это дважды, но конкретный раздел, на котором стоит сосредоточиться, может быть полезным.
Я ценю помощь. Дайте мне знать, могу ли я предоставить дополнительную информацию.
SessionInfo
> sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] bindrcpp_0.2 dplyr_0.7.4
loaded via a namespace (and not attached):
[1] Rcpp_0.12.16 utf8_1.1.3 crayon_1.3.4 assertthat_0.2.0 R6_2.2.2
[6] magrittr_1.5 pillar_1.2.1 cli_1.0.0 rlang_0.2.0.9001 rstudioapi_0.7.0-9000
[11] tools_3.4.4 glue_1.2.0 yaml_2.1.19 compiler_3.4.4 pkgconfig_2.0.1
[16] bindr_0.1.1 tibble_1.4.2