更改函数中的值

时间:2013-05-19 21:21:42

标签: r function

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

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

  return (delay)
}

我有许多功能与此完全相同但是&#34; L4&#34;更改为不同的值,例如&#34; L5&#34;所以会是:

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")

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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&amp; var1具有相同的值,但有时希望它们是不同的值,然后Frank的推荐(在上面的注释中)是现场打开,这是为了设置var2的默认值 值为var1的值。

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

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