【发布时间】:2019-08-30 06:00:54
【问题描述】:
我有类似以下数据集:
myDT <- structure(list(domain = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), id = 2:22, L1 = 2:22), row.names = c(NA,
-21L), class = c("data.table", "data.frame"))
我想创建一个新列 L2,它为每 2 行 在 domain 创建一个索引。但是,如果有余数,例如 domain=2 和 id=8,9,10,那么只要它们在同一个 domain 内,就应该将这些 ids 编入索引。请注意,玩具数据集中的特定 id 值是由组成的,并不总是如图所示连续。输出将是:
structure(list(domain = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), id = 2:22, L1 = 2:22, L2=c(1L,1L,2L,2L,3L,3L,4L,4L,4L,
5L,5L,6L,6L,7L,7L,8L,8L,9L,9L,10L,10L)),
row.names = c(NA, -21L), class = c("data.table", "data.frame"))
在 data.table 中是否有有效的方法来执行此操作?
我尝试在子集调用中使用 .N/rowid 和整数除法运算符 %/%(因为每个 n 行应该给出相同的值),但它让我无处。例如,我尝试过类似的方法:
myDT[, L2 := rowid(domain)%/%2]
但显然这并不能满足 domain=2 中的最后 3 行具有相同索引以及索引应继续为 domain=3 递增的要求。
EDIT请查看修改后的所需输出数据表及相应说明。
编辑 2
这是myDT的附加版本:
myDT2 <- structure(list(domain = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), id = 2:40,
L1 = 2:40), row.names = c(NA, -39L), class = c("data.table",
"data.frame"))
当我在上面运行@chinsoon12 的代码时,我得到:
structure(list(domain = c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 5L, 5L,
5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), id = 2:40,
L1 = 2:40, L2 = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L, 5L,
5L, 6L, 6L, 7L, 7L, 8L, 8L, 9L, 9L, 10L, 10L, 11L, 11L, 11L,
11L, 12L, 12L, 13L, 13L, 14L, 14L, 15L, 15L, 16L, 16L, 17L,
17L, 18L, 18L)), row.names = c(NA, -39L), class = c("data.table",
"data.frame"))
L2=11 似乎有 4 个值,而其中两个应该是 12,因为它们位于不同的域中。
【问题讨论】:
-
是否需要泛化到 2 以外的 diff 窗口大小?
标签: r indexing data.table