我正在尝试使用存储在另一个数据表(dt
)中的基线值来规范化数据表(dt.base
)中的值。接下来,您将获得这些表的示例内容以及生成该示例的代码:
> dt
Bench Config Part Power
1: A 10 P 171
2: A 10 Q 125
3: A 100 P 139
4: A 100 Q 109
5: B 10 P 196
6: B 10 Q 101
7: B 100 P 157
8: B 100 Q 176
> dt.base
Bench Config Part Power
1: A Base P 187
2: A Base Q 104
3: B Base P 166
4: B Base Q 188
示例生成代码:
set.seed(13)
dt <- data.table(
Bench = c(rep('A', 4), rep('B', 4)),
Config = rep(c(10, 10, 100, 100), 2),
Part = rep(c('P', 'Q'), 4),
Power = round(runif(8, 100, 200)))
dt.base <- data.table(
Bench = c(rep('A', 2), rep('B', 2)),
Config = c('Base', 'Base', 'Base', 'Base'),
Part = rep(c('P', 'Q'), 2),
Power = round(runif(4, 100, 200)))
我们的想法是将dt
中的所有值除以dt.base
中的相应值。因此,该表将成为:
Bench Config Part Power
1: A 10 P 171 / 187
2: A 10 Q 125 / 104
3: A 100 P 139 / 187
4: A 100 Q 109 / 104
5: B 10 P 196 / 166
6: B 10 Q 101 / 188
7: B 100 P 157 / 166
8: B 100 Q 176 / 188
我认为解决方案非常简单,但我遇到了一些问题。这是我目前的尝试:
normalize.power <- function(pwr, base.pwr) {
pwr / base.pwr
}
dt.norm <- dt[,
Power <- normalize.power(
.SD, dt.base[Bench == Bench & Config == 'Base' & Part == Part,
'Power', with = F]
), by = list(Bench, Config, Part)]
问题是normalize.pwr
在第二个参数(base.pwr
)中没有收到单个值,而是包含dt.base
中所有幂值的向量。但是,当我从命令行直接执行时
dt.base[Bench == 'A' & Config == 'Base' & Part == 'P', 'Power', with = F]
然后我按预期获得单个功率值。
我将非常感谢能够解决我的问题或帮助我解决问题的任何帮助。
答案 0 :(得分:9)
您可以尝试这样的事情
setkey(dt, Bench, Part)
setkey(dt.base, Bench, Part)
dt[dt.base, Power := Power / i.Power]
dt
## Bench Config Part Power
## 1: A 10 P 0.91444
## 2: A 100 P 0.74332
## 3: A 10 Q 1.20192
## 4: A 100 Q 1.04808
## 5: B 10 P 1.18072
## 6: B 100 P 0.94578
## 7: B 10 Q 0.53723
## 8: B 100 Q 0.93617
感谢@Arun提供有用的i.Power
语法