gpt4 book ai didi

r - 使用 data.table 为行 block 创建组标签

转载 作者:行者123 更新时间:2023-12-05 00:10:31 26 4
gpt4 key购买 nike

我有类似以下数据集的内容:

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 ,然后那些 id s 应该一起索引,只要它在同一个 domain 内.具体请注意 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 .

编辑 请参阅修订后的所需输出数据表和相应说明。

编辑 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 时,因为它们在不同的域中。

最佳答案

一个想法是创建一个自定义函数,该函数将根据每个组的长度和该长度除以二时的余数创建顺序向量。功能是,

f1 <- function(x) {
v1 <- length(x)
i1 <- rep(seq(floor(v1 / 2)), each = 2)
i2 <- c(i1, rep(max(i1), v1 %% 2))
i2 + seq_along(i2)
}

我试图通过 data.table 申请它但是我收到了一个关于错误的错误,所以这里是基于 R 的,
cumsum(c(TRUE, diff(with(myDT2, ave(id, domain, FUN = f1))) != 1))
#[1] 1 1 2 2 3 3 4 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19

关于r - 使用 data.table 为行 block 创建组标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57721232/

26 4 0