【问题标题】:Conditional merging between time values of 2 dataframe in RR中2个数据帧的时间值之间的条件合并
【发布时间】:2018-07-01 15:49:55
【问题描述】:

我有 2 个不同结构的数据框。第一个包含对几个样本进行连续和重复分析的数据(多行,每次测量的时间和值),第二个报告样本 ID 以及测量的开始和结束时间。

##example
df.analysis <- data.frame(var= rnorm(321,mean=50),
                  time= seq(strptime("2018-1-1 0:0:0","%Y-%m-%d %H:%M:%S"), strptime("2018-1-1 8:0:0","%Y-%m-%d %H:%M:%S"), by= 90))

df.sample <- data.frame(sample= rep_len(1:8, 30),
                  start=seq(strptime("2018-1-1 0:0:0","%Y-%m-%d %H:%M:%S"), strptime("2018-1-1 7:45:0","%Y-%m-%d %H:%M:%S"),length.out=30),
                  end=seq(strptime("2018-1-1 0:15:0","%Y-%m-%d %H:%M:%S"), strptime("2018-1-1 8:0:0","%Y-%m-%d %H:%M:%S"),length.out=30))

我应该插入与每个测量值对应的样本 ID,但请记住,并非所有测量值都对应于一个样本。 我尝试使用以下代码,但它不起作用,因为现在它将第一个数据库中的行与第二个数据库中的相应行进行比较。虽然我需要将第一个数据库中的每一行与第二个数据库中的所有行进行比较

if df.analysis$time >df.sample[,"start"] & df.analysis$time < df.sample[,"end"] {
  df.analysis$sample <-  df.sample$sample
  }

我想使用for 循环或lapply,但我无法使它们正常工作。

【问题讨论】:

    标签: r datetime merge


    【解决方案1】:

    我们可以使用非等连接

    library(data.table)
    setDT(df.analysis)[df.sample, sample := sample, on = .(time > start, time <end)]
    

    【讨论】:

    • 谢谢,尽管它在示例中正常工作,但将其应用于我的数据会出现以下消息:forderv(x, rightcols, retGrp = TRUE) 中的错误:第 9 列的长度为 11不同于第 1 列的长度 (113259)
    • @Matt_4 最好有一个可重现的小例子来显示您的帖子中的错误
    • 时间数据属于“POSIXlt”类,使用as.POSIXct转换后,您的代码可以正常工作。再次感谢您
    【解决方案2】:

    使用sqldf 包的一个选项可以通过使用inner joinleft outer join 来实现:

    library(sqldf)
    
    sqldf("select analysis.*, matchedSample.sample from
      'df.analysis' analysis 
      left outer join 
         (select sample.sample, analysis.time 
          from 'df.sample' sample,'df.analysis' analysis 
          where analysis.time > sample.start 
          and analysis.time < sample.end) matchedSample on
       analysis.time = matchedSample.time")
    
    #          var                time sample
    # 1   49.41763 2018-01-01 00:00:00     NA
    # 2   50.20399 2018-01-01 00:01:30      1
    # 3   48.80242 2018-01-01 00:03:00      1
    # 4   50.56982 2018-01-01 00:04:30      1
    # 5   50.08948 2018-01-01 00:06:00      1
    # 6   50.32223 2018-01-01 00:07:30      1
    # 7   49.60842 2018-01-01 00:09:00      1
    # 8   50.82316 2018-01-01 00:10:30      1
    # ....
    # .... 313 more rows 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2018-09-27
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多