具有多个值更改的 if 语句的矢量化输入(使函数与 apply 一起使用)
vectorized inputs for if statements with several value changes (enabling a function to be used with apply)
我正在尝试将包中的函数应用到数据框的某些列。
包裹链接 here.
但是,包的作者使用了简单的 if 语句,由于矢量化条件,这不允许我使用 apply 函数。我的问题是具体修复 this function,以便我可以在应用函数中使用它。
主要有4个if语句需要寻址:
1:
if (month < 1 | month > 12)
stop("month is outside the range 1-12")
if (day < 1 | day > 31)
stop("day is outside the range 1-31")
2:
if (month < 7)
{
days <- days + 31 * (month -1 )
} else{
days <- days + 186 + 30 * (month - 7)
}
3:
if (days > 36524)
{
days <- days - 1
gyear <- gyear + 100 * (days %/% 36524)
days <- days %% 36524
if (days >= 365)
days <- days + 1
}
4:
if (days > 365)
{
gyear <- gyear + ((days - 1) %/% 365)
days <- (days - 1) %% 365
}
现在我知道我可以用简单的 ifelse 语句修复其中的一些问题,但我看到人们避免在 ifelse 语句中分配变量,我更喜欢使用通用方法来修复这个问题。另外,dplyr 的 case_when 也不能普遍应用。
谁能帮我用一般比较有效的方法解决这个问题?
编辑-
根据 MrFlick 的评论,这就是我打算使用该功能的方式
我的数据框中有以月为单位的原始日期(总计月数)
convert_date_to_greg <- function(x){
year = floor(as.numeric(x)/12)
month = (as.numeric(x)%%12)+1
day = 1
ifelse(is.na(x)==FALSE,return(jal2greg(year,month,day,asDate = T)),return(NA))
}
greg_convert <- lapply(date_sorted_df[,date_column_indices],
FUN=convert_date_to_greg)
这是示例输入:
df<- data.frame(date_1=c(16735,16234,17123,16123), date_2=c(16352,16352,16666,17124))
但是,使用应用时,我会看到以下错误消息:
the condition has length > 1
apply()
类型函数用于向量化函数;它们不应该与这样的功能一起使用。您可能需要修复该功能或使用 apply()
.
以外的解决方案
我建议修复函数(R 代码应尽可能矢量化)。对于 1,您只想检查是否有任何输入无效。对于 2-4,ifelse()
会有帮助。
对于 1:
if (sum(month < 1 | month > 12) != 0) { stop("a month is outside the range 1-12") }
if (sum(day < 1 | day > 31) != 0) { stop("a day is outside the range 1-31") }
对于 2:
days <- ifelse(month < 7, days + 31 * (month -1 ), days + 186 + 30 * (month - 7))
对于 3:
days <- days - 1
gyear <- gyear + 100 * (days %/% 36524)
days <- days %% 36524
days <- ifelse(days >= 365, days <- days + 1, days)
4人:
gyear <- ifelse(days > 365, gyear + ((days - 1) %/% 365, gyear)
days <- ifelse(days > 365, (days - 1) %% 365, days)
我正在尝试将包中的函数应用到数据框的某些列。 包裹链接 here.
但是,包的作者使用了简单的 if 语句,由于矢量化条件,这不允许我使用 apply 函数。我的问题是具体修复 this function,以便我可以在应用函数中使用它。
主要有4个if语句需要寻址:
1:
if (month < 1 | month > 12)
stop("month is outside the range 1-12")
if (day < 1 | day > 31)
stop("day is outside the range 1-31")
2:
if (month < 7)
{
days <- days + 31 * (month -1 )
} else{
days <- days + 186 + 30 * (month - 7)
}
3:
if (days > 36524)
{
days <- days - 1
gyear <- gyear + 100 * (days %/% 36524)
days <- days %% 36524
if (days >= 365)
days <- days + 1
}
4:
if (days > 365)
{
gyear <- gyear + ((days - 1) %/% 365)
days <- (days - 1) %% 365
}
现在我知道我可以用简单的 ifelse 语句修复其中的一些问题,但我看到人们避免在 ifelse 语句中分配变量,我更喜欢使用通用方法来修复这个问题。另外,dplyr 的 case_when 也不能普遍应用。 谁能帮我用一般比较有效的方法解决这个问题?
编辑- 根据 MrFlick 的评论,这就是我打算使用该功能的方式 我的数据框中有以月为单位的原始日期(总计月数)
convert_date_to_greg <- function(x){
year = floor(as.numeric(x)/12)
month = (as.numeric(x)%%12)+1
day = 1
ifelse(is.na(x)==FALSE,return(jal2greg(year,month,day,asDate = T)),return(NA))
}
greg_convert <- lapply(date_sorted_df[,date_column_indices],
FUN=convert_date_to_greg)
这是示例输入:
df<- data.frame(date_1=c(16735,16234,17123,16123), date_2=c(16352,16352,16666,17124))
但是,使用应用时,我会看到以下错误消息:
the condition has length > 1
apply()
类型函数用于向量化函数;它们不应该与这样的功能一起使用。您可能需要修复该功能或使用 apply()
.
我建议修复函数(R 代码应尽可能矢量化)。对于 1,您只想检查是否有任何输入无效。对于 2-4,ifelse()
会有帮助。
对于 1:
if (sum(month < 1 | month > 12) != 0) { stop("a month is outside the range 1-12") }
if (sum(day < 1 | day > 31) != 0) { stop("a day is outside the range 1-31") }
对于 2:
days <- ifelse(month < 7, days + 31 * (month -1 ), days + 186 + 30 * (month - 7))
对于 3:
days <- days - 1
gyear <- gyear + 100 * (days %/% 36524)
days <- days %% 36524
days <- ifelse(days >= 365, days <- days + 1, days)
4人:
gyear <- ifelse(days > 365, gyear + ((days - 1) %/% 365, gyear)
days <- ifelse(days > 365, (days - 1) %% 365, days)