Cómo alimentar una lista de nombres de columnas sin comillas en `lapply` (para que pueda usarla con una función` dplyr`)
Estoy tratando de escribir una función entidyverse/dplyr
que quiero usar eventualmente conlapply
(omap
) (Había estado trabajando en ello paraResponde esta pregunta, pero se encontró con un resultado interesante / callejón sin salida. No marque esto como un duplicado: esta pregunta es una extensión / desviación de las respuestas que ve allí).
Esta ahí
1) una forma de obtener una lista de variables citadas para trabajar dentro de una función dplyr
(y no usar el obsoletoSE_
funciones)o hay
2) alguna forma de alimentar una lista de cadenas sin comillas a través de unlapply
omap
He usado elProgramming in Dplyr
viñeta para construir lo que creo que es una función más acorde con el estándar actual para trabajar con la 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)
Una función generadora de informes.report <- 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])
}
Lo que funciona bien para generar un solo informe:
> 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
Es cuando trato de configurar una lista de los 4 informes para generar, que todo se descompone. (Aunque es cierto que el código requerido en esa última línea de la función, para devolver una cadena con la que luego se debe llenar la columna, debería ser una pista suficiente que me haya desviado en la dirección incorrecta).
#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)
Lo que resulta en:
> 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
También he tratado de convertir la lista de cadenas en nombres antes de pasarla aapply
ymap
:
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
En cualquier caso, la razón por la que hago esta pregunta es porque creo que he escrito la función a los estándares actualmente documentados, pero finalmente no puedo ver ninguna manera de utilizar un miembro delapply
o incluso de lapurrr::map
familia con tal función. Corto de reescribir la función a usarnames
me gustausuario ha hecho aquíhttps://stackoverflow.com/a/47316151/5088194 ¿Hay alguna manera de hacer que esta función funcione?apply
omap
?
Espero ver esto 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