r - 根据第二个数据帧按组在一个数据帧中创建日期序列

标签 r data.table

我有两个共享分组 ID 的数据框。我想根据另一个日期设置的条件在一个日期中创建一系列日期。 MRE如下:

jdates <- structure(list(Group.1 = c(8, 9), x = structure(c(16674, 16661), class = "Date")), .Names = c("Group.1", "x"), row.names = c(NA, -2L), class = c("data.table", "data.frame"))

jtrying <- structure(list(id = c(8, 8, 8, 9, 9, 9), values1 = 1:6, values2 = 7:12), .Names = c("id", "values1", "values2"), row.names = c(NA, -6L), class = c("data.table", "data.frame"))

在此示例中,我想在 jtrying 中创建一列日期从jdates中的下一个日期开始(每组 - Group.1 中的 jdatesid 中的 jtrying)。

对于 data.table,这些(糟糕的)方法都不起作用:

jtrying[ , date := seq(jdates$x + 1, length.out=3, by = 1), by = jdates$Group.1]

jtrying[ , date := seq(jdates$x + 1, length.out=3, by = 1), by = id]

jtrying[ , date := lapply(.SD,(seq(jdates$x + 1, length.out=3, by = 1))), by = id]

jtrying[ , date := lapply(.SD,function(x) seq(jdates$x + 1, length.out=3, by = 1)), by = id]

我一直在尝试 data.table 方法,因为它们被认为更快(并且真实数据相当大),但实际上,任何东西(在合理范围内)都可以。

我的预期结果是一个如下所示的 data.frame:

 jtrying
   id values1 values2       date
1:  8       1       7 2015-08-28
2:  8       2       8 2015-08-29
3:  8       3       9 2015-08-30
4:  9       4      10 2015-08-15
5:  9       5      11 2015-08-16
6:  9       6      12 2015-08-17

最佳答案

这就是我要做的

jtrying[jdates, 
  date := seq(from=x+1, by=1, length.out=.N)
, on=c(id="Group.1"), by=.EACHI]

此语法 X[Y, newcol := ..., on=c(Xcol=Ycol), by=.EACHI] 的工作原理如下:

  • Xon 中标识的列上的 Y 合并。
  • X 为合并列的每个值(即 by=.EACHI)单独构建其 newcol

关于r - 根据第二个数据帧按组在一个数据帧中创建日期序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32506089/

相关文章:

sql - 将 data.table 更新到 SQL 数据库?

r - dplyr::funs() 软弃用 - 更新以返回变量名称

regex - R:缩写字符串中的状态名称

r - 将单变量 coxph 函数一次应用于多个协变量(列)

r - 带有 'by' 参数的 data.table 的奇怪行为?

r - data.table 相当于 dplyr::filter_at

R: 无法从 url 下载 .zip

r - 如何使用 renv 更新项目中使用的 R 版本

函数开发中 knitr/data.table 组合的 R 奇怪范​​围问题

r %in% 数据表因素的运算符(operator)行为?