首先按组,然后对R data.table中的每个其他组成员相同
我有一个data.table,我想为其添加一列,该列按组计算第一个组成员的随机统一数,然后复制组其余成员的结果。让我们看看这个例子:首先按组,然后对R data.table中的每个其他组成员相同,r,data.table,R,Data.table,我有一个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
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
在预期结果中,Z的值0.2875775适用于所有a,0.9404673适用于所有b,依此类推。理想情况下,我想要一个不需要排序的解决方案,这就是为什么我不想使用移位函数之类的东西。更好的做法是使用ID和代码作为双键,一旦有了ID的解决方案,这可能就没有问题了
我尝试的是:
DT[DT[, .SD[1], by=ID], Z:= runif(.N)]
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
我尝试的是:
DT[DT[, .SD[1], by=ID], Z:= runif(.N)]
DT[DT[, .SD[1], by=ID], Z:= runif(.N)]
这不起作用,而且只会为第一个组成员获取值
你可以做:
DT[unique(DT[, .(ID)])[, Z := runif(.N)], on=.(ID), Z := i.Z][]
# or
DT[.(ID = unique(ID), Z = runif(uniqueN(ID))), on=.(ID), Z := i.Z][]
对这就是我要找的。DT[,Z:=reprunif1,.N,by=.ID,code]工作也是可疑的。