【发布时间】:2019-07-30 22:28:22
【问题描述】:
我是 R 新手,这是我关于 stackoverflow 的第一个问题。
我在努力
- 通过引用分配给新列
- 每一行
- 使用同一组行中第一下一行的值
- 满足条件。
示例数据:
id code date_down date_up
1: 1 p 2019-01-01 2019-01-02
2: 1 f 2019-01-02 2019-01-03
3: 2 f 2019-01-02 2019-01-02
4: 2 p 2019-01-03 <NA>
5: 3 p 2019-01-04 <NA>
6: 4 <NA> 2019-01-05 2019-01-05
7: 5 f 2019-01-07 2019-01-08
8: 5 p 2019-01-07 2019-01-08
9: 5 p 2019-01-09 2019-01-09
10: 6 f 2019-01-10 2019-01-10
11: 6 p 2019-01-10 2019-01-10
12: 6 p 2019-01-10 2019-01-11
我想做的是
- 子集(组)
id - 对于每一行
- 找到
date_up以获取更下方的第一行, - 其中
code = 'p'和date-up(找到的行)大于我正在更新的行的date-down。
我的预期结果应该是:
id code date_down date_up founddate
1: 1 p 2019-01-01 2019-01-02 <NA>
2: 1 f 2019-01-02 2019-01-03 <NA>
3: 2 f 2019-01-02 2019-01-02 <NA>
4: 2 p 2019-01-03 <NA> <NA>
5: 3 p 2019-01-04 <NA> <NA>
6: 4 <NA> 2019-01-05 2019-01-05 <NA>
7: 5 f 2019-01-07 2019-01-08 2019-01-08
8: 5 p 2019-01-07 2019-01-08 2019-01-09
9: 5 p 2019-01-09 2019-01-09 <NA>
10: 6 f 2019-01-10 2019-01-10 2019-01-11
11: 6 p 2019-01-10 2019-01-10 2019-01-11
12: 6 p 2019-01-10 2019-01-11 <NA>
我尝试了很多变体,使用.SD、.N,创建一个新列
DT[, idcount:= seq_leg(.N),by=id],但并没有真正到达任何地方。非常感谢任何帮助。
还有对 data.table 的任何好的参考 :) 非常感谢
编辑:
我已经编辑了提供的原始数据以给出一个更微妙的示例,其中第 10 行使用第 12 行的数据进行更新,因为第 12 行在 id 子集中并且符合资格标准。第 11 行不符合资格标准,因此数据不用于更新第 10 行。还包括我第一次使用dput!
示例数据为dput 代码:
dt <- structure(list(
id = c(1L, 1L, 2L, 2L, 3L, 4L, 5L, 5L, 5L, 6L, 6L, 6L),
code = c("p", "f", "f", "p", "p", "<NA>", "f", "p", "p", "f", "p", "p"),
date_down = structure(c(17897, 17898, 17898, 17899, 17900, 17901, 17903, 17903, 17905, 17906, 17906, 17906), class = "Date"),
date_up = structure(c(17898, 17899, 17898, NA, NA, 17901, 17904, 17904, 17905, 17906, 17906, 17907), class = "Date")),
class = c("data.table", "data.frame"),
row.names = c(NA, -12L))
setDT(dt) # to reinit the internal self ref pointer (known issue)
【问题讨论】:
-
您的示例数据中有一些日期是 2017 年。我是不是读错了问题,还是您的示例数据都应该是 2019 年?
-
是的,感谢您发现错别字。真实数据有更多的列。我会更正数据。
-
欢迎来到 SO!请始终将示例数据添加为 R 代码,以便我们更容易回答(例如,使用
dput)。 TXH! -
@R Yoda 是的,数据是排序的,按id升序,如果id相同则按date_down升序,如果前两个相同则按date_up升序。虽然我手工制作了示例数据,但我认为它是这样表示的。
-
感谢您有兴趣帮助我 - 答案如下 founddate 是否包含找到的“p”行的 date_up 数据?是的,你更新所有行还是只更新非“p”行? - 如果找到与条件匹配的后续行,则应更新所有行,无论代码的“p”状态如何如果更新所有行(包括“p”):自“p”的创建日期以来是否需要再次更新-rows 可以解释为新的 date_up?不,此元数据用于其他目的
标签: r data.table