我有一个如下所示的数据集:
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-15 1 132102 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
值以及共享相同OID
的所有行,以查找"Dateincide"
最接近(前后)的行"Local_date"
。然后写&#34; Keep&#34;对于名为"Keep/delete"
的新列中具有最接近日期的这些行。
但是有一个条件:有些行具有相同的OID并且具有相同的&#34; Local_date&#34;,所以在某些情况下似乎会有两个或更多相同的记录比赛。我想保留所有这些匹配不仅仅是一个,因为它们根据列#34; id_treat_1&#34;来表示不同的记录。
我想要的输出如下(我已经做了简短说明,但我想保留所有其余的列):
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,已被标记为&#34;保持&#34;因为他们在&#34; Local_date&#34;中有最接近的日期。到&#34; Dateincide&#34;并且他们在&#34; id_treat_1&#34;中有不同的价值;柱。在具有OID 13的记录的情况下,选择具有最接近日期的行并且仅存在一个因为在&#34; id_treat_1&#34;中没有具有不同值的另一个匹配。列。
有关如何计算此问题的任何帮助&#34;保留/删除&#34;将允许多个匹配以及如何处理丢失数据的列将非常感谢!
答案 0 :(得分: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'