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

関数に可変引数を含める方法を単に尋ねているようです。

解決策は次のとおりです。

  • ステップ 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 に答える
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 に答える