1

我有以下工作正常的功能:

d16<-function(x) {
  delay<-difftime(tail(x$date.time[x$station == "L4"],1),
              x$date.time[x$station == "L4"][1],units="mins")

  return (delay)
}

我有许多与此完全相同的功能,但是“L4”更改为不同的值,例如“L5”,因此将是:

d17<-function(x) {
  delay<-difftime(tail(x$date.time[x$station == "L5"],1),
              x$date.time[x$station == "L5"][1],units="mins")

  return (delay)
}

是否可以将其写入代码以便它自动更改,而不是一遍又一遍地编写函数

一些样本数据:

structure(list(date.time = structure(c(1365923863, 1365923895, 
1365923931, 1365923950, 1365923965, 1368143290, 1368143310, 1368143370, 
1368164838, 1368165029, 1368165346, 1368165376, 1368165474, 1368165497, 
1368165536, 1368165574, 1368165608, 1368165626, 1368165661, 1368165719, 
1368165736, 1368165858, 1368165923, 1368165952, 1368165991, 1368175156, 
1368175173, 1368175193), class = c("POSIXct", "POSIXt"), tzone = ""), 
station = c("L4", "L4", "L4", "L4", "L4", "L5", "L5", 
"L5", "L5", "L5", "L5", "L5", "L5", "L5", "L5", "L5", 
"L5", "L5", "L5", "L5", "L5", "L5", "R05", "L5", "L5", 
"L5", "L5", "L5"), code = c(10897, 10897, 10897, 10897, 
10897, 10897, 10897, 10897, 10897, 10897, 10897, 10897, 10897, 
10897, 10897, 10897, 10897, 10897, 10897, 10897, 10897, 10897, 
10897, 10897, 10897, 10897, 10897, 10897)), .Names = c("date.time", 
"station", "code"), row.names = c(26L, 27L, 28L, 29L, 30L, 3038L, 
3039L, 3040L, 3059L, 3060L, 3061L, 3062L, 3063L, 3064L, 3065L, 
3066L, 3067L, 3068L, 3069L, 3070L, 3071L, 3072L, 3073L, 3074L, 
3075L, 3076L, 3077L, 3078L), class = "data.frame")
4

2 回答 2

2

我认为这可能对您有用,因为看起来您只是在difftime为每个站点拍摄 s。您需要先运行install.packages("data.table")

require(data.table)
dt <- data.table(x)
dt[,difftime(date.time[1],date.time[.N],units="mins")[[1]],by=station]

结果将是一个 data.frame/data.table 列出站点和延迟。默认情况下,延迟列将命名为“V1”。您可以更改最后一行以设置自定义名称:

dt[,list(
    delay=difftime(date.time[1],date.time[.N],units="mins")[[1]]
),by=station]

这是一个例子。有了这些数据...

set.seed(1)
x <- data.frame(
    date.time=sample(seq.Date(as.Date("2013-05-18"),as.Date("2013-06-02"),1),10),
    station=rep(c("A","B"),5),
    stringsAsFactors=FALSE
)

我得到这个结果:

   station  delay
1:       A -12960
2:       B   7200

可能您的数据已经排序,因此延迟将始终具有相同的符号,但如果没有,您可以为数据表设置键,列将按它们排序:setkey(dt,station,date.time).

要获得 的矩阵difftimes,可以使用基本 R 函数outer

firsts <- dt[,date.time[1],by=station][,{names(V1)<-station;V1}]
lasts <- dt[,date.time[.N],by=station][,{names(V1)<-station;V1}]
outer(firsts,lasts,difftime,units="mins")

这使

       A    B
A -12960 5760
B -11520 7200

不幸的是,difftime它给出了奇怪的输出,所以要以良好的方式获取这些信息data.frame,我们需要滚动一个新函数:

my_difftime <- Vectorize(function(x,y)difftime(x,y,units="mins")[[1]])
diffs <- as.data.frame(outer(firsts,lasts,my_difftime))

使用(新发布的)样本数据,我们得到

          L4          L5         R05
L4     -1.70 -37522.1667 -37367.6667
L5  36988.75   -531.7167   -377.2167
R05 37365.97   -154.5000      0.0000

该矩阵中的每个条目都显示了difftime行站的第一次观察和列站的最后一次观察之间的时间。

于 2013-05-19T21:34:30.093 回答
2

看起来您只是在询问如何在函数中包含变量参数。

解决方案是:

  • 第 1 步:在里面包含一个变量function(...)
  • 步骤2:用变量替换函数中的值
  • 第 3 步:调用函数时,提供适当的值

例如:

d <- function (x,  var) { 
###                 ^^^    Variable incliuded

  delay<-difftime(tail(x$date.time[x$station == var],1),
###         replace the value with variable name ^^^   

              x$date.time[x$station == var][1],units="mins")
###  ... everywhere the value appears   ^^^^

  return (delay)
}

现在当你调用函数时:

d(x, "L5")
d(x, "L4")
...
etc

您可以根据需要使用尽可能多的变量。例如:

d <- function (x,  var1, var2) 
  {  ..<do something with var1 and var2>.. }

你可以给任何变量一个默认值。当您调用该函数时,如果您不更改该变量的值,它将采用其默认值。

如果您有时希望var2&var1具有相同的值,但有时希望它们是不同的值,那么 Frank 的建议(在上面的评论中)是正确的,即将 setvar2的默认值设置为 的值var1

d <- function (x,  var1, var2=var1) 
  {  ..<do something with var1 and var2>.. }    

(请注意,R在实际使用之前不会评估(检查)每个变量的值,这就是为什么这样做的原因,而且,请确保var1在评估之前不要更改函数内的值var2

于 2013-05-19T21:49:23.193 回答