【问题标题】:R - apply function across every rowR - 在每一行应用函数
【发布时间】:2013-05-24 22:48:38
【问题描述】:

我有以下函数可以从给定日期获取星期

getWeek <- function (year, month, day) {
  date <- as.Date(paste(year, month, day, sep = "-"), "%Y-%b-%d")
  week <- format(date, "%W")
  return(week)
}

我想将上述函数应用于以下 data.frame x 并在 x 中创建一个新列。我尝试使用mapply,但它给了我NA

> dput(x)
structure(list(year = c(2003L, 2010L, 2012L, 2012L, 2007L), month = structure(c(3L, 
10L, 9L, 8L, 6L), .Label = c(" Apr", " Aug", " Dec", " Feb", 
" Jan", " Jul", " Jun", " Mar", " May", " Nov", " Oct", " Sep"
), class = "factor"), day = c(4L, 3L, 25L, 26L, 18L), Humidity = structure(c(38L, 
71L, 73L, 49L, 87L), .Label = c("10", "100", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", 
"47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", 
"58", "59", "6", "60", "61", "62", "63", "64", "65", "66", "67", 
"68", "69", "7", "70", "71", "72", "73", "74", "75", "76", "77", 
"78", "79", "8", "80", "81", "82", "83", "84", "85", "86", "87", 
"88", "89", "9", "90", "91", "92", "93", "94", "96", "97", "N/A"
), class = "factor")), .Names = c("year", "month", "day", "Humidity"
), row.names = c(2605L, 80763L, 108420L, 106512L, 54342L), class = "data.frame")


>  mapply(getWeek, x$year, x$month, x$day)
[1] NA NA NA NA NA

我需要将getWeek 应用于x 中的每一行吗? mapply 合适吗?

【问题讨论】:

    标签: r vectorization apply


    【解决方案1】:

    由于您的函数已经矢量化,因此您根本不需要使用 apply。相反,只需使用正确的变量调用它(一旦您修复了下面的错误,您的 mapply 解决方案也将起作用):

    with(x, getWeek(year, month, day))
    

    但是,您在每个月之前都有一个前导空格。所以要么你需要使用格式字符串%Y- %b-%d' or remove it:x$month

    【讨论】:

      【解决方案2】:

      您的getWeek 功能已损坏。

      它应该看起来像这样:

      getWeek <- function (year, month, day) {
        date <- as.Date(paste(year, month, day, sep = "-"), "%Y- %b-%d")
        week <- format(date, "%W")
        return(week)
      }
      

      你需要考虑你几个月的领先空间。

      当然,

      x$month <- substring(x$month,2)
      

      也可以解决您的问题。

      【讨论】:

      • 不得不选择一个答案,我选择了最早的一个。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多