Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 未使用的参数_R_Dplyr_Mutate - Fatal编程技术网

R 未使用的参数

R 未使用的参数,r,dplyr,mutate,R,Dplyr,Mutate,我有一个函数Mark_FareTypeExcl,我想用它定义表中每一行的Faretype。 我使用dplyr mutate来使用此函数填充表上的派生列 df= df%>% rowwise() %>% mutate(D_FareType = Mark_FareTypeExcl(SRegion,TKT_DESIGNATOR, TOUR_CD) ) 然而,它给出了一个错误- ifelse中的错误(isTRUE(grepl(“/in”,TKT_指示符,i

我有一个函数Mark_FareTypeExcl,我想用它定义表中每一行的Faretype。 我使用dplyr mutate来使用此函数填充表上的派生列

df= df%>%
        rowwise()  %>%
        mutate(D_FareType = Mark_FareTypeExcl(SRegion,TKT_DESIGNATOR, TOUR_CD) ) 
然而,它给出了一个错误- ifelse中的错误(isTRUE(grepl(“/in”,TKT_指示符,ignore.case=T)),: 未使用的参数(alist())

谁能帮我一下,让我知道这个问题

---代码---


几乎不可能帮助您解决错误,因为您的问题缺少可复制的示例(例如,
dput(df)
的输出,因此我们可以运行您的代码)。但是,我们可以做一些常规的事情来提高您发现错误的机会

首先,
ifelse
很有用,但效率很低。而且它不会生成可读性很强的代码。就像您的情况一样,每当我们嵌套多个
ifelse
语句时,几乎不可能读取和查找其中的错误。
dplyr
有一种更高效、可读性更强的替代方法,称为
case_当
通过指定逻辑语句(
grepl
返回
TRUE
FALSE
这是逻辑语句)然后指定返回值来工作时

除此之外,通过将正则表达式更改为包含“或”,可以删除许多
ifelse
语句这是用竖条表示的。这使您的代码更具可读性。最后但并非最不重要的是,我们可以在
grepl
周围创建一个包装函数,这样我们就不必每次执行函数时都指定参数,或者在调用之前对输入调用
tolower
toupper
grepl
,以略微提高性能。所有这些结合在一起可以在下面看到:

Mark_FareTypeExcl = function(Region, TKT_DESIGNATOR, TOUR_CD){
  # ensure all is in upper caps for comparisons.
  TKT_DESIGNATOR <- toupper(TKT_DESIGNATOR)
  TOUR_CD <- toupper(TOUR_CD)
  Region <- toupper(Region)
  # Helper function so we dont have to specify all arguments to grepl every time.
  greplc <- function(x, which = TKT_DESIGNATOR)
    grepl(x, which)
  # Find the reagion and compare fare.
  if(Region == "EMEAI"){
    case_when(greplc('/CH') ~ 'Child Fares',
              greplc('/IN') ~ 'Infant Fares',
              greplc('TO') ~ 'Tour Operator',
              greplc('/OG|/CE|/CK|/CM|/CV|/CY|/C0') ~ 'Corporate Fares',
              greplc('CA|DG|MZ|MIL|GR') ~ 'Government Fares',
              greplc('GR') ~ 'Group Fares',
              greplc('401GBT|401BB|834GH', TOUR_CD) ~ 'IT/Net Fares',
              TRUE ~ '')
  } else if(Region == "APAC"){
    case_when(greplc('/CH') ~ 'Child Fares',
              greplc('/IN') ~ 'Infant Fares',
              TRUE ~ '')
  }else
    # If we are in an unknown region, throw an error
    stop("unknown region")
}

再一次,这两种方法都未经测试,因为问题中没有可重复的示例

这里有一种方法,与您的方法非常相似:

library(dplyr)
Mark_FareTypeExcl = function(Region, TKT_DESIGNATOR, TOUR_CD){
case_when(Region == "EMEAI" & grepl("/CH",TKT_DESIGNATOR, ignore.case = T) ~ "Child Fares",
         Region == "EMEAI" & grepl("/IN",TKT_DESIGNATOR, ignore.case = T) ~ "Infant Fares",
         Region == "EMEAI" & grepl("TO",TKT_DESIGNATOR, ignore.case = T) ~ "Tour Operator",
         Region == "EMEAI" & grepl("/OG",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CE",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CK",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CM",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CV",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CY",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/C0",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/C0",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares",
         Region == "EMEAI" & grepl("CA",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("DG",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("MZ",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("MIL",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("GR",TKT_DESIGNATOR, ignore.case = T) ~ "Group Fares",
         Region == "EMEAI" & grepl("401GBT",TOUR_CD, ignore.case = T) ~ "IT/Net Fares",
         Region == "EMEAI" & grepl("401GBB",TOUR_CD, ignore.case = T) ~ "IT/Net Fares",
         Region == "EMEAI" & grepl("834GH",TOUR_CD, ignore.case = T) ~ "IT/Net Fares",
         Region == "APAC" & grepl("/CH",TKT_DESIGNATOR, ignore.case = T) ~ "Child Fares",
         Region == "APAC" & grepl("/IN",TKT_DESIGNATOR, ignore.case = T) ~ "Infant Fares",
         TRUE ~ "")
}

ifelse()时使用
case\u,而不是嵌套的
ifelse
s
用于向量运算;
isTRUE
不是。您应该放弃所有的
isTRUE
调用。此外,在
ignore.case=T
参数中使用
T
而不是
TRUE
会有点风险。使用key/val数据和fuzzyjoin可能会更好
Mark_FareTypeExcl = function(Region, TKT_DESIGNATOR, TOUR_CD){
  # ensure all is in upper caps for comparisons.
  TKT_DESIGNATOR <- toupper(TKT_DESIGNATOR)
  TOUR_CD <- toupper(TOUR_CD)
  Region <- toupper(Region) 
  # Pre-calculate region vector
  EMEAI <- Region == 'EMEAI'
  APAC <- Region == 'APAC'
  # Test whether we have an unknown region
  if(any(!EMEAI & !APAC))
    # Generate error string of the unknown regions.
    stop(sprintf('Unknown region(s): [%s]',
                 paste0(Region[!EMEAI & !APAC], collapse = ', ')))
  # Helper function
  greplc <- function(x, which = TKT_DESIGNATOR, region = EMEAI)
    grepl(x, which) & region
  # Find the reagion and compare fare.
  case_when(greplc('/CH') ~ 'Child Fares',
            greplc('/IN') ~ 'Infant Fares',
            greplc('TO') ~ 'Tour Operator',
            greplc('/OG|/CE|/CK|/CM|/CV|/CY|/C0') ~ 'Corporate Fares',
            greplc('CA|DG|MZ|MIL|GR') ~ 'Government Fares',
            greplc('GR') ~ 'Group Fares',
            # Tour CD
            greplc('401GBT|401BB|834GH', TOUR_CD) ~ 'IT/Net Fares',
            # APAC region
            greplc('/CH', APAC) ~ 'Child Fares',
            greplc('/IN', APAC) ~ 'Infant Fares',
            TRUE ~ ''
}

# Used as:
df %>% 
  mutate(D_FareType = Mark_FareTypeExcl(SRegion, TKT_DESIGNATOR, TOUR_CD))
library(dplyr)
Mark_FareTypeExcl = function(Region, TKT_DESIGNATOR, TOUR_CD){
case_when(Region == "EMEAI" & grepl("/CH",TKT_DESIGNATOR, ignore.case = T) ~ "Child Fares",
         Region == "EMEAI" & grepl("/IN",TKT_DESIGNATOR, ignore.case = T) ~ "Infant Fares",
         Region == "EMEAI" & grepl("TO",TKT_DESIGNATOR, ignore.case = T) ~ "Tour Operator",
         Region == "EMEAI" & grepl("/OG",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CE",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CK",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CM",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CV",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/CY",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/C0",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares", 
         Region == "EMEAI" & grepl("/C0",TKT_DESIGNATOR, ignore.case = T) ~ "Corporate Fares",
         Region == "EMEAI" & grepl("CA",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("DG",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("MZ",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("MIL",TKT_DESIGNATOR, ignore.case = T) ~ "Government Fares",
         Region == "EMEAI" & grepl("GR",TKT_DESIGNATOR, ignore.case = T) ~ "Group Fares",
         Region == "EMEAI" & grepl("401GBT",TOUR_CD, ignore.case = T) ~ "IT/Net Fares",
         Region == "EMEAI" & grepl("401GBB",TOUR_CD, ignore.case = T) ~ "IT/Net Fares",
         Region == "EMEAI" & grepl("834GH",TOUR_CD, ignore.case = T) ~ "IT/Net Fares",
         Region == "APAC" & grepl("/CH",TKT_DESIGNATOR, ignore.case = T) ~ "Child Fares",
         Region == "APAC" & grepl("/IN",TKT_DESIGNATOR, ignore.case = T) ~ "Infant Fares",
         TRUE ~ "")
}
Mark_FareTypeExcl(Region = c("EMEAI","APAC"), TKT_DESIGNATOR = c("CA","/IN"), TOUR_CD = c("384GH","401GBT"))
[1] "Government Fares" "Infant Fares"