> set.seed(42)
> ids <- c("u1", "u2", "u3")
> groups <- c(rep("A",3), rep("B",3), rep("C",3))
> reps <- c(rep("r1",9), rep("r2",9), rep("r3",9))
> vals <- rnorm(27, 0, 2)
>
> df = data.frame(ids = rep(ids, 9), groups = rep(groups,3), reps = reps, vals = vals)
> df
ids groups reps vals
1 u1 A r1 2.7419169
2 u2 A r1 -1.1293963
3 u3 A r1 0.7262568
4 u1 B r1 1.2657252
5 u2 B r1 0.8085366
6 u3 B r1 -0.2122490
7 u1 C r1 3.0230440
8 u2 C r1 -0.1893181
9 u3 C r1 4.0368474
10 u1 A r2 -0.1254282
11 u2 A r2 2.6097393
12 u3 A r2 4.5732908
13 u1 B r2 -2.7777214
14 u2 B r2 -0.5575775
15 u3 B r2 -0.2666427
16 u1 C r2 1.2719008
17 u2 C r2 -0.5685058
18 u3 C r2 -5.3129108
19 u1 A r3 -4.8809339
20 u2 A r3 2.6402267
21 u3 A r3 -0.6132772
22 u1 B r3 -3.5626169
23 u2 B r3 -0.3438347
24 u3 B r3 2.4293494
25 u1 C r3 3.7903869
26 u2 C r3 -0.8609383
27 u3 C r3 -0.5145388
我想要做的就是减去C.r1,C.r2和C.r3值的平均值为每个ID。这个想法是使用C组作为其他组的基准。
所以在预期结果而言,对于第一两行:
(U1,A,R1)应修改为2.74 - 平均(3.02,1.27,3.79)= 0.046
我怎样才能得到这个在所有行工作均值(-0.18,-0.56,-0.86)= -0.69
-
(U2,A,R1)应修改为-1.23一大盘e(大约1M行)表,其中包含除此处相关的其他列之外的其他几列?我显然需要按ids
进行分组,但是特别匹配group == C
以及val的平均值的值的查找有点棘手。
> dt <- setDT(df)
> dt[groups == "C", cmean := mean(vals), ids]
给我C组测量每个ID的方式(在多个副本),但我真的不能立即使用这些值,因为所有其他行已经被过滤掉。我想我可能需要以某种方式连锁,但我不确定具体如何。
我会在解决方案有着同样的兴趣与data.table
和dplyr
它的作品,但我不知道为什么:)你能解释一下也许吗?在这种情况下,“subsetting”不会返回data.table吗?如何在同一个数据表索引的''''语句中使用data.table? – posdef
@posdef是的,它确实是它的子集,但是当我们通过'ids'将原始数据集加入'on'时,'平均值'为每个对应的'id'重复自己,这可以被减去。在这里,我们正在使用连接'X [Y,on =。(分组变量)]' – akrun
我明白了,是否可以避免修改原始表'dt'并返回修改后的副本la'dplyr'? – posdef