我有一个data.table
,我想为其添加一列,该列为第一个组成员按组计算一次随机统一数,然后复制该组其余成员的结果。让我们看一下这个例子:
DT = data.table(
ID = c("b","b","b","a","a","c"),
code = letters[sample(1:26,6)],
numvar = rnorm(15,0,1)
)
setorder(DT, ID, code)
set.seed(123)
DT[, Z:=runif(.N), by=ID]; DT
ID code numvar Z
1: a h 0.23821292 0.2875775
2: a h -0.73350322 0.7883051
3: a u -1.04889314 0.4089769
4: a u -0.21586539 0.8830174
5: b b 0.54909674 0.9404673
6: b b -0.78438222 0.0455565
7: b b 1.07061054 0.5281055
8: b g 2.52833655 0.8924190
9: b g -0.05568601 0.5514350
10: b g -0.08542326 0.4566147
11: b x 0.50381245 0.9568333
12: b x 0.82553984 0.4533342
13: b x -1.08569914 0.6775706
14: c s 1.29476325 0.5726334
15: c s -0.33491276 0.1029247
在期望的结果中,0.2875775
的 Z
值将适用于所有 a
, 0.9404673
适用于所有 b
等等。理想情况下,我想要一个不需要订购的解决方案,这就是为什么我不想使用 shift
函数之类的东西。更好的方法是使用 ID
和 code
作为双 key ,一旦有 ID
的解决方案,这可能就没有问题了
我尝试过的:
DT[DT[, .SD[1], by=ID], Z:= runif(.N)]
这不起作用,而且只会让我获得第一个组成员的值。
有什么想法吗?
顺便说一句:第一个或最后一个或中间的任何组成员并不重要。每组只有一个值就很好了。
最佳答案
这是您要找的吗?
DT[, Z := rep(runif(1), .N), by = ID]
ID code numvar Z
1: b u -0.86960052 0.9436197
2: b g -0.82605044 0.9436197
3: b q 0.57032375 0.9436197
4: a m 0.56402400 0.2311390
5: a b 1.26068851 0.2311390
6: c l 0.33497025 0.5874900
7: b u -0.24415676 0.9436197
8: b g 0.04127355 0.9436197
9: b q -0.21508139 0.9436197
10: a m -0.55698196 0.2311390
11: a b -0.88621853 0.2311390
12: c l -1.78180519 0.5874900
13: b u -0.68728262 0.9436197
14: b g 1.07801966 0.9436197
15: b q 1.11599245 0.9436197
关于r - 首先按组,然后对于 R data.table 中的每个其他组成员都相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57144376/