Como alimentar uma lista de nomes de colunas não citadas no `lapply` (para que eu possa usá-lo com a função` dplyr`)
Estou tentando escrever uma função notidyverse/dplyr
que eu quero usar eventualmente comlapply
(oumap
) (Eu estava trabalhando nisso pararesponda a esta pergunta, mas encontrou um resultado / beco sem saída interessante. Não marque isso como duplicado - esta pergunta é uma extensão / partida das respostas que você vê lá.)
Existe
1) uma maneira de obter uma lista de variáveis citadas para trabalhar dentro de uma função dplyr
(e não use o uso obsoletoSE_
funções)ou existe
2) alguma maneira de alimentar uma lista de cadeias não citadas por meio de umlapply
oumap
Eu usei oProgramming in Dplyr
vinheta para construir o que acredito ser uma função mais alinhada com o padrão atual para trabalhar com o NSE.
sample_data <-
read.table(text = "REVENUEID AMOUNT YEAR REPORT_CODE PAYMENT_METHOD INBOUND_CHANNEL AMOUNT_CAT
1 rev-24985629 30 FY18 S Check Mail 25,50
2 rev-22812413 1 FY16 Q Other Canvassing 0.01,10
3 rev-23508794 100 FY17 Q Credit_card Web 100,250
4 rev-23506121 300 FY17 S Credit_card Mail 250,500
5 rev-23550444 100 FY17 S Credit_card Web 100,250
6 rev-21508672 25 FY14 J Check Mail 25,50
7 rev-24981769 500 FY18 S Credit_card Web 500,1e+03
8 rev-23503684 50 FY17 R Check Mail 50,75
9 rev-24982087 25 FY18 R Check Mail 25,50
10 rev-24979834 50 FY18 R Credit_card Web 50,75
", header = TRUE, stringsAsFactors = FALSE)
Uma função geradora de relatóriosreport <- function(report_cat){
report_cat <- enquo(report_cat)
sample_data %>%
group_by(!!report_cat, YEAR) %>%
summarize(num=n(),total=sum(AMOUNT)) %>%
rename(REPORT_VALUE = !!report_cat) %>%
mutate(REPORT_CATEGORY := as.character(quote(!!report_cat))[2])
}
O que funciona bem para gerar um único relatório:
> report(REPORT_CODE)
# A tibble: 7 x 5
# Groups: REPORT_VALUE [4]
REPORT_VALUE YEAR num total REPORT_CATEGORY
<chr> <chr> <int> <int> <chr>
1 J FY14 1 25 REPORT_CODE
2 Q FY16 1 1 REPORT_CODE
3 Q FY17 1 100 REPORT_CODE
4 R FY17 1 50 REPORT_CODE
5 R FY18 2 75 REPORT_CODE
6 S FY17 2 400 REPORT_CODE
7 S FY18 2 530 REPORT_CODE
É quando tento configurar uma lista dos 4 relatórios a serem gerados que tudo se decompõe. (Embora seja certo que o código exigido nessa última linha da função - retornar uma string com a qual preencher a coluna - deve ser uma pista suficiente para que eu tenha me desviado na direção errada.)
#the other reports
cat.list <- c("REPORT_CODE","PAYMENT_METHOD","INBOUND_CHANNEL","AMOUNT_CAT")
# Applying and Mapping attempts
lapply(cat.list, report)
map_df(cat.list, report)
O que resulta em:
> lapply(cat.list, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
> map_df(cat.list, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
Também tentei converter a lista de cadeias de caracteres em nomes antes de entregá-la paraapply
emap
:
library(rlang)
cat.names <- lapply(cat.list, sym)
lapply(cat.names, report)
map_df(cat.names, report)
> lapply(cat.names, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
> map_df(cat.names, report)
Error in (function (x, strict = TRUE) :
the argument has already been evaluated
De qualquer forma, a razão pela qual estou fazendo essa pergunta é que acho que escrevi a função para os padrões atualmente documentados, mas, finalmente, não vejo como utilizar um membro daapply
ou mesmo dopurrr::map
família com essa função. Com falta de reescrever a função a ser usadanames
gostardo utilizador fez aquihttps://stackoverflow.com/a/47316151/5088194 existe uma maneira de obter essa função para trabalhar comapply
oumap
?
Espero ver isso como resultado:
# A tibble: 27 x 5
# Groups: REPORT_VALUE [16]
REPORT_VALUE YEAR num total REPORT_CATEGORY
<chr> <chr> <int> <int> <chr>
1 J FY14 1 25 REPORT_CODE
2 Q FY16 1 1 REPORT_CODE
3 Q FY17 1 100 REPORT_CODE
4 R FY17 1 50 REPORT_CODE
5 R FY18 2 75 REPORT_CODE
6 S FY17 2 400 REPORT_CODE
7 S FY18 2 530 REPORT_CODE
8 Check FY14 1 25 PAYMENT_METHOD
9 Check FY17 1 50 PAYMENT_METHOD
10 Check FY18 2 55 PAYMENT_METHOD
# ... with 17 more rows