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

时间:2014-01-24 21:54:24

标签: 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

示例生成代码:

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]

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

我将非常感谢能够解决我的问题或帮助我解决问题的任何帮助。

1 个答案:

答案 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语法