2011-01-18 4 views
6

私は定期的に行われる測定値のセットを持っているに異なる長さの2つのベクトルを組み合わせんが、一部が欠落しています:はどうすればR

 measurement_date value 
1 2011-01-17 13:00:00  5 
2 2011-01-17 13:04:00  5 
3 2011-01-17 13:08:00  7 
4 2011-01-17 13:12:00  8 
5 2011-01-17 13:16:00  4 
6 2011-01-17 13:24:00  6 
7 2011-01-17 13:28:00  5 
8 2011-01-17 13:32:00  6 
9 2011-01-17 13:36:00  9 
10 2011-01-17 13:40:00  8 
11 2011-01-17 13:44:00  6 
12 2011-01-17 13:48:00  6 
13 2011-01-17 13:52:00  4 
14 2011-01-17 13:56:00  6 

私は値を処理するために起こっていると欠損値を扱うことができる機能を持っています今

times <- timeSequence(from=.., length=60, by="min") 

私は時間の毎分の行を持っているが、私はデータをマージする必要がありますが、行は、私はこのような分ごとの行をしている配列を生成していますので、そこにあり。私はこのようなものを試しましたが、それを正しく得ることはできませんでした。

lapply(times, function(time) { 
    n <- as.numeric(time) 
    v <- Position(function(candidate) { 
     y <- as.numeric(candiated) 
     n == y 
    } 

    .. insert the value into the row here .. 
} 

しかし、私はエラーと警告しか受け取りません。私は問題を正しい方法で回避しようとしていますか?私は実際に読み取り値を実行する多くの異なる機能が存在するため、1分あたりの値を持つ「完全な」配列がほしいと思っています。

+0

ギャビンは、お見せしたように、少なくとも再現性の例を提供するようにしてください。さらに、私はあなたが過度に複雑なものになっているという気持ちがあります。機能するためにNAを追加する必要があるケースは考えられません。 –

+0

動物園のFAQ#13を参照してくださいFAQ:http://cran.r-project.org/web/packages/zoo/vignettes/zoo-faq.pdf –

答えて

8
DF <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"), 
             as.POSIXct("2011-01-17 13:56:00"), 
             by = "mins")[seq(1, 57, by = 4)][-6], 
       value = c(5,5,7,8,4,6,5,6,9,8,6,6,4,6)) 
full <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"), 
              by = "mins", length = 60), 
        value = rep(NA, 60)) 

2つのアプローチがmergeを介して、最初に使用することができる。

> v1 <- merge(full, DF, by.x = 1, by.y = 1, all = TRUE)[, c(1,3)] 
> names(v1)[2] <- "value" ## I only reset this to pass all.equal later 
> head(v1) 
    measurement_date value 
1 2011-01-17 13:00:00  5 
2 2011-01-17 13:01:00 NA 
3 2011-01-17 13:02:00 NA 
4 2011-01-17 13:03:00 NA 
5 2011-01-17 13:04:00  5 
6 2011-01-17 13:05:00 NA 

%in%を使用して導出されたインジケータ変数を介してである:

> want <- full$measurement_date %in% DF$measurement_date 
> full[want, "value"] <- DF[, "value"] 
> head(full) 
    measurement_date value 
1 2011-01-17 13:00:00  5 
2 2011-01-17 13:01:00 NA 
3 2011-01-17 13:02:00 NA 
4 2011-01-17 13:03:00 NA 
5 2011-01-17 13:04:00  5 
6 2011-01-17 13:05:00 NA 
> all.equal(v1, full) 
[1] TRUE 

マージバージョンが強くあります好まれますが、少しの作業が必要です。 %in%ソリューションは、データが時刻順にDFfullの両方にあるため、ここではうまくいきます。しかし、2つのオブジェクトを時間順に取得/確保するのは簡単です。そのため、どちらの方法も動作に少しの精巧さが必要です。私たちは、オーダー(fullで新たに始まる)で両方の変数を取得するために%in%アプローチを変更することができます。

full2 <- data.frame(measurement_date = seq(as.POSIXct("2011-01-17 13:00:00"), 
              by = "mins", length = 60), 
        value = rep(NA, 60)) 
full2 <- full2[order(full2[,1]), ] ## get full2 in order 
DF2 <- DF[order(DF[,1]), ]   ## get DF in order 
want <- full$measurement_date %in% DF$measurement_date 
full2[want, "value"] <- DF2[, "value"] 

>  all.equal(full, full2) 
[1] TRUE 
>  all.equal(full2, v1) 
[1] TRUE 
> 
+1

偉大な心は似ていると思います...--) –

+2

確かに.. (+1) "Joris-Gavin Mutual Appreciation Society" –

+1

2番目の解決方法は、正しい行順序に依存します。若干良いバージョンは '〜

6

あなたの関数では、as.numeric(candined)はas.numeric(候補)でなければなりません。ブラケットもありません。私は、あなたがあなたの機能で達成しようとしているものが何であるか分かりませんが、それは私にとっては恐ろしく複雑です。

これはあなたで動作するように何かを与える必要があり

merge(Data,times,by.x=1,by.y=1,all.y=T) 

を試してみてください。