【问题标题】:Fill a larger (empty) data frame based on a smaller one根据较小的数据框填充较大的(空)数据框
【发布时间】:2018-05-19 23:02:01
【问题描述】:

我只是想不出一种方法来根据较小的 df 填充较大的 df。我有一个大的空数据框,其中包含两个时间列(分钟和小时)和其他 12 个包含 NA 元素的列。

另一方面,我有在特定“时间标签”中进行的测量(例如在 h = 03 min = 33 或 h = 14 min 21)。

较大的数据框较大,因为它具有“连续时间”,现在我想将较小数据框的值填充到特定行。而我没有任何测量值的行,我想保留它们 NA。

还没有真正找到任何聪明的方法来做到这一点......

较小的数据集:

小时 分钟 颜色 长度 0 0 乙 1 0 15 克 2 0 30 读 2 0 45 是 5 1 0 是 3 1 15 是 2 1 30 乙 1 1 45 瓦 1 . . . 23 45 乙 3

还有更大的:

小时 分钟 颜色 长度 0 1 不适用 不适用 0 2 不适用 不适用 0 3 无 无 . . . 23 58 不适用 23 59 不适用

【问题讨论】:

  • 请展示一个可重现的小例子和预期的输出
  • 我编辑了帖子,抱歉我的格式不好,不知道如何在stackoverflow上创建正确的表格
  • 尝试merge 或加入然后合并
  • @akrun 无论如何,我想在相应的行中填充第二个表,并保持其他表不变.. 似乎是一项不可能完成的任务......
  • 或者另一个选项是v1 <- do.call(paste, dfsmall[1:2]); v2 <- do.call(paste, dflarge[1:2]); i1 <- match(v2, v1) 然后使用索引将列值分配给大数据

标签: r dataframe data-manipulation


【解决方案1】:

我们可以为此使用left_join。由于大型数据集中的最后一列是空的,因此在进行连接时将其删除,以便结果数据集中不匹配的元素将是 NA

library(dplyr)   
left_join(dflarge[1:2], dfsmall, by = c('hours', 'minutes'))

数据

dfsmall <- structure(list(hours = c(0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L), minutes = c(0L, 
15L, 30L, 45L, 0L, 15L, 30L, 45L), color = c("B", "G", "R", "Y", 
 "Y", "Y", "B", "W"), length = c(1L, 2L, 2L, 5L, 3L, 2L, 1L, 1L
 )), class = "data.frame", row.names = c(NA, -8L))

dflarge <- expand.grid(hours = 0:2, minutes = 1:59)
dflarge[c("color", "length")] <- NA
dflarge <- dflarge[do.call(order, dflarge[1:2]),]
row.names(dflarge) <- NULL

【讨论】:

  • 感谢 akrun 试图帮助我,但我仍然很困惑。那个数据sn-p是干什么用的?为什么我不能直接使用我现有的数据框?
  • 哦,我设法创建了它。仍然不能 100% 确定数据 sn-p 中发生了什么,但它仍然有效。非常感谢!
  • @Avocado 只是为了创建一个可重现的示例。结构部分来自dput(dfmall)
猜你喜欢
  • 2018-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多