【问题标题】:How to create ID (by) before merging in R?在 R 中合并之前如何创建 ID (by)?
【发布时间】:2015-11-17 08:59:39
【问题描述】:

我有两个数据框 df.odf.m,定义如下。我需要根据两个标准找到df.o(维度表)中的哪些观察对应于df.m(事实表)中的哪些观察:1)df.o$Var1==df.o$Var1df.o$date1 < df.m$date2 < df.o$date3这样我得到df.o$oID的正确值在df.m$oID 中(在df.m$CORRECToID 中手动输入正确的值)。之后我需要 ID 才能完成合并。

df.o <- data.frame(oID=1:4,
                  Var1=c("a","a","b","c"),
                  date3=c(2015,2011,2014,2015),
                  date1=c(2013,2009,2012,2013),
                  stringsAsFactors=FALSE)
df.m <- data.frame(mID=1:3,
                      Var1=c("a","a","b"),
                      date2=c(2014,2010,2013),
                      oID=NA,
                      CORRECToID=c(1,2,3),
                      points=c(5, 10,15),
                      stringsAsFactors=FALSE)

我尝试了各种组合,例如下面的代码,但没有运气:

df.m$oID[df.m$date2 < df.o$date3 & df.m$date2 > df.o$date1 & df.o$Var1==df.m$Var1] <- df.o$oID

我也尝试过使用ifelsewhichmatch 的各种组合,但似乎没有一个能奏效。

我一直遇到的问题是我的替换行数与数据不同,并且“较长的对象长度不是较短对象长度的倍数”。

【问题讨论】:

  • 所有值都是字符有什么原因吗?为什么日期不只是数字?
  • 没有特别的原因。也可以是日期。只是为了让它更简单,但如果它影响解决方案,我当然应该改变它......
  • c("2015","2011","2014","2015")(2015,2011,2014,2015) 简单吗?
  • 你是对的 - 只是改变了它。

标签: r merge match data.table


【解决方案1】:

您要查找的内容称为“重叠连接”,您可以尝试使用data.table::foverlaps 函数来实现此目的。

想法很简单

  1. 创建要重叠的列(向df.m 添加额外的列)
  2. 这些列的键
  3. 运行foverlaps 并选择要返回的列

    library(data.table)
    setkey(setDT(df.m)[, date4 := date2], Var1, date2, date4)
    setkey(setDT(df.o), Var1, date1, date3)
    foverlaps(df.m, df.o)[, names(df.m), with = FALSE]
    #    mID Var1 date2 oID CORRECToID points date4
    # 1:   2    a  2010   2          2     10  2010
    # 2:   1    a  2014   1          1      5  2014
    # 3:   3    b  2013   3          3     15  2013
    

【讨论】:

  • 谢谢!我对原始数据进行了尝试,但收到以下错误消息:Error in if (any(x[[xintervals[2L]]] - x[[xintervals[1L]]] &lt; 0L)) stop("All entries in column ", : missing value where TRUE/FALSE needed
  • 您可能有 NA,删除它们并重试。您可以使用具有col 参数的na.omit 函数。
  • 我这样做了,但发生了一些我不明白的事情:在执行 na.omit 之前,我执行了 nrow(df),它返回了 1000。然后我执行了 sum(is.na(df$x)),它返回了 0(表示我想我没有任何NA)。然后我做了df &lt;- na.omit(df,cols("x)),在做nrow(df)之后我现在得到了一个更低的数字,比如500。为什么行数更少?
  • 应该是df &lt;- na.omit(df,col = "x"),不是吗?
  • 是的,df &lt;- na.omit(df,cols="x")。我有几列,所以我想我使用的形式是df &lt;- na.omit(df,cols=c("x","y"))
猜你喜欢
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多