2016-11-02 15 views
0

私は2つのdata.frame時系列を持っています。最初のものは完了し、2番目のものは変数の1つの正しい値を持つタイムステップのみを含んでいます。私は他のすべての変数を保持する必要がありますが、2番目のdfに現れるすべての変数をNAにします。ここでは例:R:2つのdata.framesを比較し、一致しないデータを削除する

library(dplyr) 
library(tidyverse) 
library(lubridate) 

#test data: 
TDF <- tibble(DATE = seq(make_datetime(2007,09,23,06,00), make_datetime(2008,07,05,23,00), by = 600), 
      V1 = round(runif(length(DATE)),2), 
      V2 = round(runif(length(DATE)),2), 
      V3 = round(runif(length(DATE)),2)) 
TDF2 <- TDF 
TDF2 <- TDF2[TDF2$V1>0.7,] 

が出力:

> TDF 
# A tibble: 41,287 × 4 
        DATE V1 V2 V3 
       <dttm> <dbl> <dbl> <dbl> 
1 2007-09-23 06:00:00 0.89 0.21 0.03 
2 2007-09-23 06:10:00 0.26 0.54 0.70 
3 2007-09-23 06:20:00 0.74 0.22 0.80 
4 2007-09-23 06:30:00 0.31 0.48 0.38 
5 2007-09-23 06:40:00 0.93 0.26 0.21 

> TDF2 
# A tibble: 11,972 × 4 
        DATE V1 V2 V3 
       <dttm> <dbl> <dbl> <dbl> 
1 2007-09-23 06:00:00 0.89 0.21 0.03 
2 2007-09-23 06:20:00 0.74 0.22 0.80 
3 2007-09-23 06:40:00 0.93 0.26 0.21 
4 2007-09-23 07:20:00 0.91 0.36 0.83 
5 2007-09-23 07:40:00 0.95 0.87 0.91 

そして、これは私が必要なものである:

> TDF_modified 
# A tibble: 41,287 × 4 
        DATE V1 V2 V3 
       <dttm> <dbl> <dbl> <dbl> 
1 2007-09-23 06:00:00 0.89 0.21 0.03 
2 2007-09-23 06:10:00 NA 0.54 0.70 
3 2007-09-23 06:20:00 0.74 0.22 0.80 
4 2007-09-23 06:30:00 NA 0.48 0.38 
5 2007-09-23 06:40:00 0.93 0.26 0.21 

私はちょうど2つのdata.framesを使用して、一般的なソリューションが必要です。私はループを介してそれを行うことができますが、私はよりエレガントな方法があると確信しています。先進的なおかげでたくさん!ここ

答えて

1

あなたが探しているものを私に完全には明らかではありませんが、あなたの例の出力に基づいて、あなたがTDFからV2V3の結果を保つ、とだけV1読みを削除することが表示されます。

一つのアプローチは、TDF2からTDFからのみV1列にV1列なしleft_joinを使用することです:

left_join(
    select(TDF, -V1) 
    , select(TDF2, DATE, V1)) 

は与える:私のランダム化されたデータから

    DATE V2 V3 V1 
       <dttm> <dbl> <dbl> <dbl> 
1 2007-09-23 06:00:00 0.14 0.62 NA 
2 2007-09-23 06:10:00 0.87 0.05 0.87 
3 2007-09-23 06:20:00 0.20 0.52 NA 
4 2007-09-23 06:30:00 0.34 0.01 NA 
5 2007-09-23 06:40:00 0.92 0.37 0.83 
6 2007-09-23 06:50:00 0.94 0.27 NA 
7 2007-09-23 07:00:00 0.98 0.49 NA 
8 2007-09-23 07:10:00 0.70 0.98 NA 
9 2007-09-23 07:20:00 0.05 0.55 0.72 
10 2007-09-23 07:30:00 0.16 0.12 0.99 

より完全なソリューションをお探しの場合は、full_joinを実行すると重複した列が得られます。たとえば、V1の場合NAが返されますが、がない場合、V2V3の場合はTDFの値が与えられ、2つの値が存在し、異なる場合はNAとなります。私はあなたが何を使いたいか分からないので、もっと複雑なチェックをここに追加する必要があります。

full_join(TDF, TDF2, "DATE") %>% 
    mutate(V1 = ifelse(is.na(V1.y), NA, V1.x) 
     , V2 = ifelse(is.na(V2.y), V2.x 
         , ifelse(V2.x == V2.y, V2.x, NA)) 
     , V3 = ifelse(is.na(V3.y), V3.x 
         , ifelse(V3.x == V3.y, V3.x, NA)) 
     ) 

戻り値:

# A tibble: 41,287 × 10 
        DATE V1.x V2.x V3.x V1.y V2.y V3.y V1 V2 V3 
       <dttm> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
1 2007-09-23 06:00:00 0.62 0.14 0.62 NA NA NA NA 0.14 0.62 
2 2007-09-23 06:10:00 0.87 0.87 0.05 0.87 0.87 0.05 0.87 0.87 0.05 
3 2007-09-23 06:20:00 0.53 0.20 0.52 NA NA NA NA 0.20 0.52 
4 2007-09-23 06:30:00 0.03 0.34 0.01 NA NA NA NA 0.34 0.01 
5 2007-09-23 06:40:00 0.83 0.92 0.37 0.83 0.92 0.37 0.83 0.92 0.37 
6 2007-09-23 06:50:00 0.70 0.94 0.27 NA NA NA NA 0.94 0.27 
7 2007-09-23 07:00:00 0.51 0.98 0.49 NA NA NA NA 0.98 0.49 
8 2007-09-23 07:10:00 0.65 0.70 0.98 NA NA NA NA 0.70 0.98 
9 2007-09-23 07:20:00 0.72 0.05 0.55 0.72 0.05 0.55 0.72 0.05 0.55 
10 2007-09-23 07:30:00 0.99 0.16 0.12 0.99 0.16 0.12 0.99 0.16 0.12 
# ... with 41,277 more rows 

+0

ありがとう!それはかなりうまくいく! – Pelle

0

が動作するはず基地Rソリューションである:

is.na(TDF$V1[setdiff(seq_len(nrow(TDF)), match(TDF$Date, TDF2$Date))]) <- TRUE 

match機能は同じ日TDF2に存在するTDFにおける観察位置を返します。 setdiffは、この出力をこのセットの補数に変換します。つまり、日付が一致しないTDFの観測値の集合です。 TDF $ V1の値は、is.na<-メソッドを使用したこれらの観測では、NAに設定されています。

+0

ベースRソリューションのおかげで、あまりにも(そして、あなたは彼らと一緒に行われたらselectを使用するだけで、重複した列をクリーンアップします。)! – Pelle

関連する問題