我第一次使用data.table处理大量数据,迄今为止,我非常满意它的易用性。今天我已经阅读了相当多的文档(当然不是全部),但我还没有找到这个问题的解决方法。
我的数据表以placeid和t2为关键字,有一个其他列t1。我想做的是,在每行中将t1设置为0,其中t2是最小值,按placeid分组。
作为“t2”在键中,我想要更改的行是每个分组内的第一行。我能够使用“ifelse”语句使其正常工作,但是是否有更好的方法使用“[.data.table”的“i”参数来完成它?
我希望这些中的一个能够奏效,虽然再想一想,它们不起作用是有道理的:
我发现以下方法可行(结果为期望的输出):
我的数据表以placeid和t2为关键字,有一个其他列t1。我想做的是,在每行中将t1设置为0,其中t2是最小值,按placeid分组。
## Sample data
set.seed(47)
require(data.table)
dt <- data.table(placeid = rep(letters[1:3], each = 3), t1 = runif(9), t2 = runif(9))
setkeyv(dt, cols=c("placeid", "t2"))
作为“t2”在键中,我想要更改的行是每个分组内的第一行。我能够使用“ifelse”语句使其正常工作,但是是否有更好的方法使用“[.data.table”的“i”参数来完成它?
我希望这些中的一个能够奏效,虽然再想一想,它们不起作用是有道理的:
dt[1, t1 := 0, by = placeid] ## changes only first row
dt[which.min(t2), t1 := 0, by = placeid] ## changes only global min row
我发现以下方法可行(结果为期望的输出):
dt[, t1 := ifelse(t2 == min(t2), 0, t1), by = placeid] # works
dt[,t1:=t1*(t2!=min(t2)),by='placeid']
- Josh O'Brien