具有多个值更改的 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)