使用子集运算符进行数据表赋值:dt[, x[.N] := z, y]

3

我有一些data.table:

dt <- data.table(smth = 1:6, type = rep(c("cat", "dog"), each = 3))
dt
   smth type
1:    1  cat
2:    2  cat
3:    3  cat
4:    4  dog
5:    5  dog
6:    6  dog

我想对它进行一些转换:

dt[,  smth := c(smth[1:2], max(smth[1:2])), type]
dt
   smth type
1:    1  cat
2:    2  cat
3:    2  cat
4:    4  dog
5:    5  dog
6:    5  dog
# Could also do this
dt[1:nrow(dt) %% 3 == 0, smth := dt[,  max(smth[1:2]), type]$V1]

如果我能做一些像这样的内容,那就更简洁了

dt[,  smth[3] := max(smth[1:2]), type] # Results in error

我的问题

我设想的类型赋值是可能的吗?如果不行:有没有更好的方法(仍然使用data.table)来完成我所做的事情?


每个组总是只有3行吗? - akrun
是的,我认为我们可以假设这对我的目的是正确的。更一般地说,.N或b:.N,其中b是某个整数。 - s_baldur
1
关于第一个问题,答案是否定的,目前还不可能。我也尝试过很多次。 - David Arenburg
1
无论如何,我认为你可以做类似于 N <- 3 ; dt[, smth := replace(smth, N, max(smth[-N])), by = type] 这样的事情,这对我来说看起来更易读。 - David Arenburg
1个回答

3
当需要给每个分组的第一个或最后一个值赋值时,可以使用带有 mult= 的更新联接:
# Make a table containing the values you want to assign
mdt = dt[, .(msm = max(smth[-.N])), by=type]

# Update join
dt[mdt, on=.(type), mult="last", smth := i.msm]

   smth type
1:    1  cat
2:    2  cat
3:    2  cat
4:    4  dog
5:    5  dog
6:    5  dog

如需将更一般的分配应用于子集,可参考此开放的FR


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接