我有一些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)来做我已经做过的事情?
答案 0 :(得分: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
对于子集的更一般分配,有一个open FR。