根据最近的日期选择行,同时满足R中的其他条件

时间:2016-05-05 11:40:25

标签: r function date select

我有一个如下所示的数据集:

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;将允许多个匹配以及如何处理丢失数据的列将非常感谢!

1 个答案:

答案 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'