【问题标题】:Join smaller data frame to larger data frame by index in tidyverse?通过tidyverse中的索引将较小的数据帧连接到较大的数据帧?
【发布时间】:2020-12-06 16:25:52
【问题描述】:

假设我有以下数据:

df <- data.frame(a=c(1,2,3,4))
index <- data.frame(a=c(1,3), data=c('x', 'y'))

我想加入 df 和索引,这样我最终得到的结果包含 df 的行,但 index$data 加入了适当的 index$a。出于某种原因,英语单词让我失望了,但是 'x' 应该应用于 1 和 2(因为 index$a 有 1,而 3 是“下一个”索引值),并且 'y' 应该应用于 3 和 4 .

这是我想要最终得到的数据:

df2 <- data.frame(a=c(1,2,3,4), data=c('x', 'x', 'y', 'y'))

理想情况下,此解决方案与 tidyverse 兼容,无需加载任何其他库。

建议?

【问题讨论】:

  • 仅供参考,tidyverse 只是库的集合,因此当您加载 tidyverse 时,您实际上是在加载至少十几个库。如果您想尽量减少开销,dplyr 是唯一需要进行连接的 tidyverse 库。无论如何,您正在寻找左联接,并且已经有很多 SO 帖子涵盖了该内容

标签: r tidyverse


【解决方案1】:

这是你想要的吗?首先,加入dfindex 并将所有观察结果保存在df 中。然后,我们用最后一个非NA 观察值填充所有NA 值。

df %>% left_join(index, by = "a") %>% fill(data)

【讨论】:

  • 好的,谢谢!你回答得太快了,我不能再接受 4 分钟,但我会的。
【解决方案2】:

我们可以使用data.table

library(data.table)
library(zoo)
setDT(df)[index,  data := i.data, on = .(a)][, data := na.locf0(data)]

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    相关资源
    最近更新 更多