我有一个如下所示的数据集:
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"的行。然后在一个名为"Keep/delete"的新列中为这些具有最近日期的行编写“保存”。
但是有一个条件:有些行将具有相同的OID,并且具有相同的"Local_date",因此在某些情况下,似乎会有两个或更多的记录是相同的匹配。我希望保留所有这些匹配,而不仅仅是一次,因为它们根据"id_treat_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因此,有两个具有相同OID= 3的记录被标记为“保持”,因为它们在"Local_date“中的日期与"Dateincide”最近,并且在"id_treat_1“列中有不同的值。在使用OID 13的记录中,选择了日期最近的行,而且只有一行,因为在"id_treat_1“列中没有另一个匹配项的值不同。
任何关于如何计算这个允许多个匹配的“保持/删除”列的帮助,以及如何处理丢失的数据,都将非常感谢!
发布于 2016-05-05 12:14:12
您需要将您的日期转换为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'https://stackoverflow.com/questions/37049676
复制相似问题