R 未使用的参数
我有一个函数Mark_FareTypeExcl,我想用它定义表中每一行的Faretype。 我使用dplyr mutate来使用此函数填充表上的派生列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
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"