2

シーケンスを識別し、シーケンスの継続時間を分単位で計算する関数を使用しています。最終段階で結果をデータにバインドすると、期間が返されますが、隣接する列はそれらの列の元の値ではなく「NA」で返されます

d<-read.table(text='Date.Time Aerial
794  "2012-10-01 08:18:00"      1
795  "2012-10-01 08:34:00"      1
796  "2012-10-01 08:39:00"      1
797  "2012-10-01 08:42:00"      1
798  "2012-10-01 08:48:00"      1
799  "2012-10-01 08:54:00"      1
800  "2012-10-01 08:58:00"      1
801  "2012-10-01 09:04:00"      1
802  "2012-10-01 09:05:00"      1
803  "2012-10-01 09:11:00"      1
1576 "2012-10-01 09:17:00"      2
1577 "2012-10-01 09:18:00"      2
804  "2012-10-01 09:19:00"      1
805  "2012-10-01 09:20:00"      1
1580 "2012-10-01 09:21:00"      2
1581 "2012-10-01 09:23:00"      2
806  "2012-10-01 09:25:00"      1
807  "2012-10-01 09:32:00"      1
808  "2012-10-01 09:37:00"      1
809  "2012-10-01 09:43:00"      1', header=TRUE, stringsAsFactors=FALSE, row.names=1)
#Give correct data type
d$Aerial<- as.numeric(d$Aerial)
d$Date.Time<- as.POSIXct(d$Date.Time)

機能 (空中 2 が繰り返されるシーケンスとシーケンスの長さを特定する):

fun1 <- function(data,aerial){
  data_above <- 1L*(data$Aerial == aerial)
  id_start <- paste(data$Date.Time[which(diff(c(0L,data_above))==1)])
  id_end <- paste(data$Date.Time[which(diff(c(data_above,0L))== -1)])
  res <- cbind(data[id_start,1:1],Duration=difftime(id_end,id_start, units='mins'))
  return(res)
}
fun1(d,2)

戻り値:

        Duration
[1,] NA        1
[2,] NA        2

期間は正しいですが、関連する列にあるはずのデータを返したいと思います:

     Date.Time                     Duration
[1,] 2012-10-01 09:11:00            1
[2,] 2012-10-01 09:21:00            2

私の実際のdata.frameには、Date.Timeだけでなく多くの列があり、これらすべてに対してNAを返します

4

1 に答える 1

2

私は次のようにします:

fun1 <- function(data,aerial) {
    data_above <- 1L * (data$Aerial == aerial)
    id_start <- data$Date.Time[which(diff(c(0L,data_above)) == 1)]
    id_end <- data$Date.Time[which(diff(c(data_above, 0L)) == -1)]
    res <- cbind(data[data$Date.Time %in% id_start, 1, drop=FALSE], 
                  Duration = difftime(id_end,id_start, units='mins'))
   return(res)
}
fun1(d,2)

#                Date.Time Duration
# 1576 2012-10-01 09:17:00   1 mins
# 1580 2012-10-01 09:21:00   2 mins

ここでの注意点:

  • a をサブセット化しdata.frameて 1 つの要素だけを返す場合、実行df[, 1]するとベクトルになります。安全に使用できますdf[, 1, drop = FALSE

  • data.frame引数を渡す (つまり、すべての引数cbindが data.frames ではない) と、出力はmatrix. 少なくとも 1 つの引数が であることが期待されますdata.frame。したがって、使用せずdrop = FALSE、出力結果が 1 行の場合、それはベクトルになり、結果は行列になります (最初のポイントを参照)。

  • pasteここでid_startandを使用する必要はないと思いますid_end

  • cbindにアクセスする場所への最初の引数がdata.frame data正しくありません。id_startのすべての値内でクエリを実行する必要がありますDate.Time。示されているように使用して実行できます%in%

お役に立てれば。

于 2013-03-29T17:14:01.327 に答える