2016-05-05 9 views
0

に追加基準を満たしながら、私はこのようになりますデータセットを持っている最も近い日付に基づいて:選択行R

data <- read.table(text = "OID  Local_date  Dateincide  Join_Count  TARGET_FID  JOIN_FID  indiv_code  indiv_name  sex  month  year  treatment  perturbati  xx  yy  id_treatme  id_treat_1  lion_month  treatment_  OID_hc  DateRecord  Year_1  location  village  Longhomest  Lathomeste  Longitude  Latitude  Animalslos  Specieslos 
3 2015-10-25 2008-01-15 1 127415 2 NGAaF1 Ngamo_Urchin F 10 2015 E A 547514.43970000000 7883074.46200000000 11 11E NGAaF1_10_2015 11E_NGAaF1_10_2015 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-01-18 2008-01-15 1 128429 2 NGAaF1 Ngamo_Urchin F 1 2016 E A 547461.30170000000 7882858.82600000000 11 11E NGAaF1_1_2016 11E_NGAaF1_1_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-02-23 2008-01-15 1 128858 2 NGAaF1 Ngamo_Urchin F 2 2016 E A 547395.24460000000 7883056.29100000000 11 11E NGAaF1_2_2016 11E_NGAaF1_2_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2015-10-25 2008-01-15 1 130659 2 NGAaF1 Ngamo_Urchin F 10 2015 E A 547514.43970000000 7883074.46200000000 12 12E NGAaF1_10_2015 12E_NGAaF1_10_2015 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-01-18 2008-01-15 1 131673 2 NGAaF1 Ngamo_Urchin F 1 2016 E A 547461.30170000000 7882858.82600000000 12 12E NGAaF1_1_2016 12E_NGAaF1_1_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-02-23 2008-01-2 2 NGAaF1 Ngamo_Urchin F 2 2016 E A 547395.24460000000 7883056.29100000000 12 12E NGAaF1_2_2016 12E_NGAaF1_2_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle", header = TRUE) 

各行コード"OID""Local_date""Dateincide"およびその他の属性を持つレコードです。私は現在、NAとしてコード化されていないが、空白のままのデータが欠落しています。元のデータセットは大きく、120,000行と40個の列があるため、最も効率的な方法で以下を実行するRコードを見つけようとしています。の値と同じOIDを共有するすべての行について、"Dateincide""Local_date"に最も近い(前または後の)行を探します。次に、最も近い日付の新しい行を"Keep/delete"という名前で保存します。

条件があります:同じOIDを持ち、同じ「Local_date」を持つ行があるため、場合によっては同じ一致である2つ以上のレコードが存在するようです。私は、これらのマッチのすべてを "id_treat_1"という列に基づいて異なるレコードを表現しているので、1つだけではないようにしたい。

私が欲しいの出力は、以下の(私はそれを明確にすることを短くしているが、私は同様に、列のすべての残りの部分を残しておきたい)である:

OID Local_date Dateincide keep/delete id_treat_1 
3 2015-10-25 2008-01-15 keep  11E 
3 2016-01-18 2008-01-15 delete  11E 
3 2016-02-23 2008-01-15 delete  11E 
3 2015-10-25 2008-01-15 keep  12E 
3 2016-01-18 2008-01-15 delete  12E 
3 2016-02-23 2008-01-15 delete  12E 
13 2011-11-08 2008-02-14 keep  7E 

だからと2つのレコードがあります同じOID = 3は、 "Local_date"から "Dateincide"に最も近い日付を持ち、 "id_treat_1"列に異なる値を持つため、 "keep"とラベル付けされています。 OID 13のレコードの場合は、最も近い日付の行が選択され、「id_treat_1」列に別の値を持つ別の一致がなかったため、1つしかありません。

複数の一致を許可するこの「保存/削除」列の計算方法や、欠落しているデータを処理する方法については、非常に感謝しています。

+1

を行うことができ、あなたは考慮にあなたの制約のすべてを取る例を投稿できますか?すなわち、異なるIDおよび異なるid_treatを有するか? – Sotos

答えて

0

日付をPOSIXctに変換する必要がありますので、それらを差し引くことができます。 dplyrを使用して、保持/削除列を作成できます。

library(dplyr) 
data$Local_date <- as.POSIXct(data$Local_date, 
           format='%Y-%m-%d') 
data$Dateincide <- as.POSIXct(data$Dateincide, 
           format='%Y-%m-%d') 
data %>% 
    group_by(OID) %>% 
    mutate(keep.delete = 
     ifelse(Local_date - Dateincide == min(Local_date - Dateincide), 'keep', 'delete')) 

#  OID Local_date Dateincide id_treat_1 keep.delete 
# (int)  (time)  (time)  (dbl)  (chr) 
#1  3 2015-10-25 2008-01-15   11  keep 
#2  3 2016-01-18 2008-01-15   11  delete 
#3  3 2016-02-23 2008-01-15   11  delete 
#4  3 2015-10-25 2008-01-15   12  keep 
#5  3 2016-01-18 2008-01-15   12  delete 
#6  3 2016-02-23 2008-01-15   12  delete 

あなたid_treat_1制約については、新しいデータフレームとして上記を保存(data3言う)、その後

data3$keep.delete[duplicated(data3)] <- 'delete' 
+1

ありがとう!それは完璧に働いた! – AnnK