【问题标题】:Calculate every value in a vector within a function计算函数内向量中的每个值
【发布时间】:2013-02-06 03:00:55
【问题描述】:

我做了一个函数来计算某一年是否是闰年,如下所示:

isLeapday<-function(x) {
     if (as.numeric(x)%%100==0 & as.numeric(x)%%400==0 | as.numeric(x)%%4==0 &      as.numeric(x)%%100!=0) return (TRUE) 
     else return (FALSE)
}


isLeapday(x)

我收到错误消息

“在 if (as.numeric(x)%%100 == 0 & as.numeric(x)%%400 == 0 | as.numeric(x)%%4 == : 条件的长度 > 1,并且只会使用第一个元素”

基本上只计算第一个值,我该如何计算,以便计算向量中的每个值,如果可能,返回一个逻辑向量?

【问题讨论】:

  • 你见过chron中的leap.year函数吗?

标签: r function vector


【解决方案1】:
isLeapday<-function(x) {
  x %% 100 == 0 & x %% 400 == 0 | x %% 4 == 0 & x %% 100 != 0
}

years <- 2004:2013

isLeapday(years)

# [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE

或如mnel所述:

library("chron")
leap.year(years)

 [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE

leap.year{chron}的代码:

library("chron") 
edit(leap.year)

function (y) 
{
    if (inherits(y, "dates")) 
        y <- month.day.year(as.numeric(y), origin. = origin(y))$year
    y%%4 == 0 & (y%%100 != 0 | y%%400 == 0)
}

【讨论】:

  • 个人偏好是避免使用ifelse(),我觉得不直观。他本可以使用 vapply(x,isLeapday)
  • 我觉得写成(year %% 4 == 0) &amp; ((year %% 100 != 0) | (year %% 400 == 0))很容易理解
猜你喜欢
  • 2017-09-23
  • 2016-05-19
  • 1970-01-01
  • 2019-04-19
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多