Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
首先按组,然后对R data.table中的每个其他组成员相同_R_Data.table - Fatal编程技术网

首先按组,然后对R 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

我有一个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
在预期结果中,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]工作也是可疑的。