我正在探索如何在data.table
进行行操作的替代方法,我想我发现了一个错误。
这三行代码应该返回相同的结果。 但是, by = .I
的结果似乎返回了错误的结果。
dt[, sdd := sum(.SD[, 2:4, with=FALSE]), by = 1:NROW(dt) ]
dt[, rowpos := .I][ , sdd := sd(.SD[, -1, with=FALSE]), by = rowpos ]
dt[ , sdd := sd(.SD[, -1, with=FALSE]), by = .I ]
样本数据:
dt <- data.table(V0 =LETTERS[c(1,1,2,2,3)],
V1=1:5,
V2=3:7,
V3=5:1)
或者, by = .I
应该给出一个错误,尽管让它与i-expression
一起工作会很好。
在by
使用.N
类似问题(再次,人们可能会天真地尝试 - dt[, ..., by = 1:.N]
- 尽管这个特定的表达式给出了错误,但它并不是真正的“正确”错误)。
为什么不通过使用by = .I
来“按行”添加功能,这听起来很直观。
嗨@leoluyi ,
by = .I
的行为等价于by = NULL
。 看看这个 SO 讨论https://stackoverflow.com/questions/37667335/row-operations-in-data-table-using-by-i