r - 如何根据同一列但不同行上的值更新列中的值?

标签 r data.table dplyr

举个例子:

> 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

我想做的是为每个 id 减去 C.r1、C.r2 和 C.r3 中值的平均值。这个想法是使用 C 组作为其他组的基线。

所以就预期结果而言,对于前两行:

  • (u1, A, r1) 应修改为 2.74 - mean(3.02, 1.27, 3.79) = 0.046

  • (u2, A, r1) 应修改为 -1.23 - mean(-0.18, -0.56, -0.86) = -0.69

我怎样才能让它在一个大的(大约 100 万行)表中的所有行上工作,这个表除了这里的相关列之外还包含许多其他列?我显然需要按 ids 进行分组,但是查找与 group == C 特别匹配的值以及 vals 的平均值有点棘手。

> dt <- setDT(df)
> dt[groups == "C", cmean := mean(vals), ids]

为每个 id 提供了 C 组测量值(多份),但我不能立即使用这些值,因为所有其他行都已被过滤掉。我想我可能需要以某种方式链接,但我不确定具体如何链接。

我对使用 data.tabledplyr 的解决方案同样感兴趣

最佳答案

我们可以在对“C”的“组”进行子集化后进行连接,按“ids”分组,获得“vals”的mean,然后我们连接原始数据集 'ids' 上,用第二个数据集的 'Meanvals' 减去第一个数据集中的 'vals' 并将其分配 (:=) 到 'newvals'

setDT(df)[df[groups=="C", .(Meanvals = mean(vals)), ids], 
                         newvals := vals - Meanvals, on = .(ids)]
head(df)

关于r - 如何根据同一列但不同行上的值更新列中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43848511/

相关文章:

r - 使用 diff 函数后如何对数据进行制表?

r - Dplyr、过滤器和 SE

在 R 中的包 RecordLinkage 中使用函数 RLBigDataLinkage 记录链接数据帧

r - 制定对 CoinSpot API 的 POST 请求

r - 错误: package or namespace load failed for ggplot2 and for data.table

r - 将数据从 R data.table 中的一行复制到新行

regex - 使用正则表达式过滤 dplyr sqlite3 连接

r - 在 R 中,双百分比在矩阵上使用时如何工作?

r - 情节旁边的索引表

r dplyr 过滤器错误 - 列具有不受支持的类型