【问题标题】:How to use apply or vapply in a dataset column with a multiple parameter function如何在具有多参数函数的数据集列中使用 apply 或 vapply
【发布时间】:2019-05-13 19:43:53
【问题描述】:

我的数据集称为数据,我有一个名为时间的列,其中包含 mm:ss 格式的时间。我还写了一个函数functime(var1,var2)。

我最终希望使用 apply 或 vapply 并将 var2 设置为常量(假设 var2 = 6),并将 var1 设置为 data$time 列的每个值。

类似:

如果

data$time <- c("10:10","11:00", "09:30"), when I do vapply(), I would like to get a 

data$output <-c(functime(data$time[1],6),functime(data$time[2],6),functime(data$time[3],6))

在本例中与

相同
data$output <- c(functime("10:10",6),functime("11:00",6),functime("09:30",6))

我的蹩脚尝试是这样的:

vapply(data$time,functime,var2 = 6,FUN.VALUE = 1)

vapply 的文档说它应该是 :vapply(x,fun,fun.value)

我对如何“说 vapply”感到困惑,我想将 data$time 列的所有行作为其第一个参数,有一个固定的第二个参数,我将其定义为 6。

最终我想使用 mutate 将我的 data$output 添加到原始数据集中。

编辑:(包括数据行和函数)

data$id <- c(9,6,5763,4)

data$time <- c("5:06","5:06","5:11","5:08")

data$city <-c("Kyle","Oklahoma","Monterey","Austin")

函数是:

    calctime <- function(racePace, raceDistance){

  # racePace is the per unit pace in mm:ss - character
  # raceDistance is the total race distance - numeric
  # Pace and race distance must use same units (km or mi or whatever)

  # Seconds to character time function
  CharMinSec <- function(sec){
    outMin <- floor(sec/60)
   outSec <- ((sec/60)-outMin)*60
    if(outSec==0 | round(outSec)<10){
      outChar <- paste0(outMin,":0",round(outSec))
    } else {
      outChar <- paste(outMin,round(outSec),sep=":")
    }
    outChar
  }

  paceMinSec <- as.numeric(strsplit(racePace,':')[[1]])
  paceSec <- paceMinSec[1]*60+ paceMinSec[2]
  raceMin <- floor(paceSec*raceDistance/60)
  raceSec <- ((paceSec*raceDistance/60)-raceMin)*60
  raceTime <- CharMinSec(raceMin*60+raceSec)
  list(Seconds=raceSec)
}

# Example of 4:15/km for a half-marathon


calctime("4:15",21.097494)

【问题讨论】:

  • 你能发布你的函数代码和你的一些数据吗?
  • 是的,我会编辑答案。该功能不是我的(针对抄袭问题),我调整了我在网上找到的一个正在做我想做的事情。
  • 完成,希望对您有所帮助

标签: r function lapply


【解决方案1】:

calcTime <- function(pace,distance){ 
  return (lubridate::period_to_seconds(lubridate::ms(pace)) * distance)
}


pace <- c("10:10","11:00", "09:30")
vapply(pace,calcTime,6,FUN.VALUE = 1)

## 10:10 11:00 09:30 
## 36960 39960 34560 

d <- tibble::as_tibble(list(pace = pace))
dplyr::mutate(d, raceSeconds = calcTime(pace,6))

## A tibble: 3 x 2
##    pace   raceSeconds
##    <chr>  <dbl>
##  1 10:10  36960
##  2 11:00  39960
##  3 09:30  34560

【讨论】:

    【解决方案2】:

    我必须更改 2 件事,但您的 vapply 呼叫是正确的。

    在函数中,我更改了最后一行,使其返回一个值而不是一个值的列表

    calctime <- function(racePace, raceDistance){
    
      # racePace is the per unit pace in mm:ss - character
      # raceDistance is the total race distance - numeric
      # Pace and race distance must use same units (km or mi or whatever)
    
      # Seconds to character time function
      CharMinSec <- function(sec){
        outMin <- floor(sec/60)
        outSec <- ((sec/60)-outMin)*60
        if(outSec==0 | round(outSec)<10){
          outChar <- paste0(outMin,":0",round(outSec))
        } else {
          outChar <- paste(outMin,round(outSec),sep=":")
        }
        outChar
      }
    
      paceMinSec <- as.numeric(strsplit(racePace,':')[[1]])
      paceSec <- paceMinSec[1]*60+ paceMinSec[2]
      raceMin <- floor(paceSec*raceDistance/60)
      raceSec <- ((paceSec*raceDistance/60)-raceMin)*60
      raceTime <- CharMinSec(raceMin*60+raceSec)
      raceSec
    }
    

    现在列表返回一个值,vapply() 有效,但在我的情况下,我必须强制时间列是一个字符

    data = data.frame(
      id = c(9,6,5763,4),
      time = c("5:06","5:06","5:11","5:08"),
      city = c("Kyle","Oklahoma","Monterey","Austin")
    )
    
    data$time = as.character(data$time)
    
    data$output = vapply(data$time,calctime,raceDistance = 6,FUN.VALUE=1) #works fine
    

    【讨论】:

    • 谢谢,知道为什么我会得到:“vapply 中的错误(data$time, calctime, raceDistance = 6, : 值必须是'double'类型,但是 FUN(X[[1]] ) 结果是类型 'list'"
    • 你改变了函数的最后一行吗?但无论如何布鲁斯的答案要好得多
    • 啊,好的,我明白了..谢谢!没关系,我正在尝试从两个答案中学习。他们可能会做我做不到的事情!
    猜你喜欢
    • 2016-02-23
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2018-09-25
    相关资源
    最近更新 更多