【问题标题】:Find match values in R by two conditions, one being a date within a time range通过两个条件在 R 中查找匹配值,一个是时间范围内的日期
【发布时间】:2020-04-27 03:59:22
【问题描述】:

我有两个不同的数据框(“Birth”、“Test”)。它们都有一列 ID 号(“mid.b”、“mid.t”),其中一些 ID 出现在两个数据帧中(甚至多次),并且没有其他共同的数据。它们都有一个带有日期值的列。在每个数据框中,一个 ID 可以出现多次,但 ID 号和日期的每个组合都是唯一的。

我想从“Test”数据框中的“res.num”列中获取一个值,以及来自“birth”DF 的匹配 m.event 值-如果 ID 在"mid.t" 匹配 "mid.b" 中的 id,如果 "Test" 中的日期比 "Birth" 中的日期早不超过 7 个月,则该 ID 的。

现在我已经有了计算月差的函数:

数据框示例:

mid.t<-c(628941,628979,64976)
res.num<-c("A59646","A60921","A61903")
date.t<-c("2016.12.11","2017.10.16","2018.06.13")
test<-cbind.data.frame(mid.t,res.num,date.t)

mid.b<-c(628941,628979,64976)
m.event<-c(21219464,22457757,23365285)
date.b<-c("2017.01.26","2018.02.12","2020.11.13")
birth<-cbind.data.frame(mid.b,m.event,date.b)

到目前为止,我已经有了计算月份日期间隔的函数:

mon_ymd<-function(x,y){
gap<-(as.yearmon(strptime(x, format = "%Y.%m.%d"))-as.yearmon(strptime(y, format="%Y.%m.%d")))*12
  return(gap)}

还有一个非常好的代码,但不能完全运行: 我得到: if (idb == idt) { 中的错误:需要 TRUE/FALSE 的缺失值

for (idt in test$mid.t){
  for (idb in birth$mid.b){
    x<-birth[birth$mid.b==idb,]$date.b
    y<-test[test$mid.t==idt,]$date.t
    if (idb==idt){
    gapmon<-mon_ymd(x,y)
      if ((gapmon<=7)&(gapmon>=0)){
        print(test[test$mid.t==idt,]$res.num)
}}}}

【问题讨论】:

  • 有没有什么特别的部分让你卡住了?这个问题,按原样,太宽泛了,无法在这里有效地回答。最终,这感觉像是在数据库中更容易提取的东西。
  • 是合并2个文件还是2个表?
  • 2 个文件,但我可以把它做成 2 个表格(只有一张)

标签: r date if-statement merge nested-loops


【解决方案1】:

我不太确定这是您需要的,但这是我可以从您的问题中翻译出来的:匹配两个数据框,然后获取两者之间的月差为 7 或更大

library("dplyr")
library("zoo")

filter(
     left_join(birth, test, by = c("mid.b" = "mid.t")) %>% 
     mutate(date.t = as.yearmon(strptime(date.t, format = "%Y.%m.%d")),
            date.b = as.yearmon(strptime(date.b, format = "%Y.%m.%d")), 
            gap = ifelse((date.t - date.b) * 12 <= -7, TRUE, FALSE)
       ), gap == TRUE)


#   mid.b  m.event    date.b res.num    date.t   gap
#1  64976 23365285 nov. 2020  A61903 jun. 2018  TRUE

【讨论】:

  • 嗨,谢谢。如果我运行这个我得到“0行”,当我显然需要得到一些东西时(根据数据库)。无论如何,我希望差距在 0 到 7 之间,包括。
  • 那么只需将date.b - date.t 更改为date.t - date.b。答案中已经发生了变化。
  • 抱歉耽搁了。我仍然得到“0行”并且它运行得太快了,所以我认为代码中还有另一个问题。我会试着找到它,但如果你有想法,我会很高兴收到你的来信。再次感谢。
  • 我做了评论中提到的更正。它在您的示例数据上运行没有问题。
猜你喜欢
  • 2017-04-25
  • 1970-01-01
  • 2021-09-18
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多