使用存储在另一个数据表中的值规范化数据表中的值

bet*_*ido 8 r data.table

我试图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
Run Code Online (Sandbox Code Playgroud)

示例生成代码:

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)))
Run Code Online (Sandbox Code Playgroud)

我们的想法是将所有值除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
Run Code Online (Sandbox Code Playgroud)

我认为解决方案非常简单,但我遇到了一些问题.这是我目前的尝试:

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)]
Run Code Online (Sandbox Code Playgroud)

问题是normalize.pwr在第二个参数(base.pwr)中没有接收到单个值,而是包含所有功率值的向量dt.base.但是,当我从命令行直接执行时

dt.base[Bench == 'A' & Config == 'Base' & Part == 'P', 'Power', with = F]
Run Code Online (Sandbox Code Playgroud)

然后我按预期获得单个功率值.

我会感谢任何解决我的问题或帮助我解决问题的帮助.

dic*_*koa 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
Run Code Online (Sandbox Code Playgroud)

感谢@Arun提供有用的i.Power语法

  • +1,请注意,您可以将`dt.base`中的`power`称为`i.Power`(当它们共享相同的名称时).所以不需要`setnames`. (3认同)