передать несколько аргументов в пользовательской функции в R? - PullRequest
0 голосов
/ 07 июня 2018

Моя цель - создать пользовательскую функцию, которая будет принимать фрейм данных, месяц или год в качестве x и категорию продукта в виде y и возвращать мне фрейм данных, содержащий 10 лучших клиентов по городу.

Я не хочу передавать город в качестве аргумента.

 toptencust <- function(df,x,y){
  library(magrittr)
  library(dplyr)

  ifelse(is.character(x)
    , df %>% 
      select_(City,Amount,Customer,Product,Year,month) %>%
      group_by_(City,Customer) %>%
      filter_(month==x & Product==y) %>% 
      summarise_(Tot_repay=sum(Amount,na.rm=T)) %>% 
      top_n(n=10)
    , df %>% 
      select_(City,Amount,Customer,Product,Year,month) %>%
      group_by_(City,Customer) %>%filter_(Year==x& Product==y) %>%
      summarise_(Tot_repay=sum(Amount,na.rm=T)) %>% 
      top_n(n=10)
    )

}

Мой набор данных выглядит как

df <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Customer    Date        Amount  month     City        Product  Year
A1          12/01/04    495415  January   BANGALORE   Gold     2004
A1          03/01/04    245899  January   BANGALORE   Gold     2004
A1          15/01/04    259490  January   BANGALORE   Gold     2004
A1          25/01/04    437555  January   BANGALORE   Gold     2004
A1          17/01/05    165973  January   BANGALORE   Gold     2005
A1          23/02/05    365367  February  BANGALORE   Gold     2005
A1          01/02/05    14473   February  BANGALORE   Gold     2005
A8          05/02/04    100002  February  PATNA       Silver   2004
A9          28/02/05    100003  February  CHENNAI     Silver   2005
A10         16/02/05    48759   February  CALCUTTA    Gold     2005
A11         23/02/05    208318  February  COCHIN      Gold     2005
A12         03/02/05    150281  February  BOMBAY      Gold     2005
A13         04/02/06    339078  February  BANGALORE   Gold     2006
A14         25/03/06    137835  March     BANGALORE   Gold     2006
A15         31/03/06    437120  March     CALCUTTA    Gold     2006
A16         23/03/06    103924  March     COCHIN      Gold     2006
A17         19/03/04    408467  March     BOMBAY      Gold     2004
A18         05/03/06    100000  March     BANGALORE   Silver   2006
A19         04/04/05    10000   April     BANGALORE   Platinum 2005
A20         30/04/06    10001   April     CALCUTTA    Platinum 2006
A21         25/04/04    10002   April     COCHIN      Platinum 2004
A22         19/04/06    100000  April     BOMBAY      Silver   2006
A23         06/04/04    80346   April     BANGALORE   Silver   2004
A24         27/04/05    100002  April     DELHI       Silver   2005
A25         05/05/04    100003  May       COCHIN      Silver   2004
A26         06/05/06    470982  May       PATNA       Gold     2006
A27         07/05/05    357376  May       CHENNAI     Gold     2005
A28         08/05/06    326050  May       TRIVANDRUM  Gold     2006
A29         09/05/05    215083  May       CALCUTTA    Gold     2005
A30         10/05/06    481343  May       BANGALORE   Gold     2006")

Моя цель - получить вывод, как показано ниже

Output required

, когда я запускаю эту функцию, я получаю сообщение об ошибке, как показано ниже:

toptencust(df,'February',2014)

Ошибка в сумме (сумма, na.rm = T): недопустимый тип(символ) аргумента

Я не могу понять проблему, пожалуйста, помогите?

1 Ответ

0 голосов
/ 08 июня 2018

При выполнении вашего примера я получаю еще одну ошибку:

Ошибка в compat_lazy_dots (.dots, caller_env (), ...): объект 'City' не найден

Это потому, что вы использовали функции "escape-люка" select_, filter_ и так далее.Вы, вероятно, сделали это, потому что вам нужно использовать переменную x в filter_(month==x & Product==y).Но теперь другие имена, такие как Product, которые должны быть именами внутри фрейма данных, также считаются переменными!

Вот учебник по старым функциям "escape-штриховки"

В настоящее время это решается по-разному с помощью оператора !!.См виньетка Программирование с помощью dplyr .

toptencust <- function(df,x,y){
    library(magrittr)
    library(dplyr)

    ifelse(is.character(x)
           , df %>% 
               select(City,Amount,Customer,Product,Year,month) %>%
               group_by(City,Customer) %>%
               filter(month == !!x & Product == !!y) %>% 
               summarise(Tot_repay=sum(Amount,na.rm=T)) %>% 
               top_n(n=10)
           , df %>% 
               select(City,Amount,Customer,Product,Year,month) %>%
               group_by(City,Customer) %>%
               filter(Year == !!x & Product == !!y) %>%
               summarise(Tot_repay=sum(Amount,na.rm=T)) %>% 
               top_n(n=10)
    )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...