【问题标题】:Match ID from col1 in col2, take value of that row's col3 if it is less than col3's value in the row that is being matched in col1从 col2 中的 col1 匹配 ID,如果它小于 col3 在 col1 中匹配的行中的值,则取该行的 col3 的值
【发布时间】:2018-08-03 15:52:15
【问题描述】:

我有一个这样的 DF:

ID_A <- c(NA,NA,132,NA,NA,NA,248,NA)
ID_B <- c(132,248,248,381,248,290,290,132)
entry <- c(1,2,2,3,4,5,5,6)
df <- data.frame(ID_A,ID_B,entry)

我希望添加一个如下所示的结果列:

df$result <- c(NA,NA,1,NA,NA,NA,4,NA)

对于每一行,如果ID_A不是NA,我想在entry col中找到对应的值:1)ID_A匹配ID_B,2)ID_A的entry列是不大于entry值的最大值对于我们在 ID_B 中匹配的 ID_A 行。

我的尝试,感觉可能很接近,但目前找不到正确的值:

df$result <- ifelse(is.na(df$ID_A),NA,df$entry[match(df$ID_A,df$ID_B) & !duplicated(df$ID_B,fromLast = TRUE)])

【问题讨论】:

  • 措辞非常混乱,但我想我明白你想说的话。您如何处理重复值? ID_A 中的 132 值可以映射到 1 或 6,如果您没有指定您想要第一个可能的值
  • 这有merge(或dplyr::*_join)的气质,如果不是因为@FelipeFlores 突出显示的傻瓜。

标签: r


【解决方案1】:

如果您的数据按entry 排序(如示例中所示)...

library(data.table)
setDT(df)

df[!is.na(ID_A), v := 
  df[.SD, on=.(ID_B = ID_A, entry < entry), mult="last", x.entry]
]

   ID_A ID_B entry result  v
1:   NA  132     1     NA NA
2:   NA  248     2     NA NA
3:  132  248     2      1  1
4:   NA  381     3     NA NA
5:   NA  248     4     NA NA
6:   NA  290     5     NA NA
7:  248  290     5      4  4
8:   NA  132     6     NA NA

它是如何工作的

x[i, ..., j] 在由i 确定的x 的子集上执行j

  • 可以通过i 中的过滤条件定义一个简单的子集,例如!is.na(ID_A)
  • 或者,子集可以通过与i 中的表的连接来定义。在这里,x = dfi = .SD = df[!is.na(ID_A)] 的连接是第一个项目符号中定义的“数据子集”; on=mult= 是连接的条件。

on= 条件写成.(xcol1 = icol1, xcol2 &lt; icol2),其中xcols 属于xicols 属于i。在连接后的j 中,可以使用此处的x.entry 之类的前缀访问每个表中的cols,以消除从哪个表中提取的歧义。

mult= 确定当on= 条件有多个匹配项时会发生什么。在这里,我们的 ID 为 248,条目 2 和 4。由于数据按entry 排序(在给定的ID_B 内),mult="last" 将选择更大的值。

最后,j 可以用来修改列,比如x[i, ..., newcol := values],它只对i 定义的x 的子集进行操作。

【讨论】:

  • Error in :=(v, df[.SD, on = .(ID_B = ID_A, entry &lt; entry), mult = "last", : Check that is.data.table(DT) == TRUE. Otherwise, := and :=(...) are defined for use in j, once only and in particular ways. See help(":=").
  • @imi 谢谢。我忘记了一条线;希望我的编辑后它可以工作
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2022-06-15
相关资源
最近更新 更多