按组和变量名称在R数据框中缩放值

时间:2014-01-13 12:35:08

标签: r apply multiplication

我希望将一大组缩放因子应用于数据框,这些因子特定于样本来自的组,特别是样本的每个变量。我试图为这个问题构建一个最小的例子。

缩放因素

Batch A     B
Q     1.01  1.31
R     0.90  1.22
S     1.04  1.09

DATA

Batch A     B
Q     23    10
Q     22    11
R     27    12
R     26    13
S     22    14
S     24    15
那么,那么,批量Q样本1将从23,10到23.23,13.1

我意识到在解决方案中可能会有一个应用,但我正在努力找出从哪里开始。任何帮助非常感谢: - )

scaling_factors_example<-data.frame(Batch=c("Q","R","S"),A=c(1.01,0.9, 1.04), B=c(1.31, 1.22, 1.09))

data_example<-data.frame(Batch=c("Q","Q","R","R","S","S"), A=c(23,22,27,26,22,24), B=c(10,11,12,13,14,15))

2 个答案:

答案 0 :(得分:5)

如果你采用合并方式而不是使用申请系列会更容易,我认为(sscaling_factors_exampleddata_example

m <- merge(d[ ,1, drop=F], s, "Batch")
d[-1] <- m[-1] * d[-1]
d

  Batch     A     B
1     Q 23.23 13.10
2     Q 22.22 14.41
3     R 24.30 14.64
4     R 23.40 15.86
5     S 22.88 15.26
6     S 24.96 16.35

<强>解释

merge为您提供与您的数据大小相同的数据框,其中包含每个条目的相应缩放因子。现在您可以简单地将列相乘。

答案 1 :(得分:4)

关于马克答案的借口(借用他的缩写),除了它使用match而不是合并,因为N-1连接通常要快得多:

d[, -1] <- d[, -1] * s[match(d[, 1], s[, 1]), -1]

产生

#   Batch     A     B
# 1     Q 23.23 13.10
# 2     Q 22.22 14.41
# 3     R 24.30 14.64
# 4     R 23.40 15.86
# 5     S 22.88 15.26
# 6     S 24.96 16.35

match在第二个向量中找到第一个向量中值的位置,这有效地允许进行N-1合并,就像这里的情况一样。正如我所指出的那样,它更快,如果您加入了大型表,这可能很重要:

library(microbenchmark)
microbenchmark(s[match(d[, 1], s[, 1]), -1])

# Unit: microseconds
#     min      lq   median      uq     max neval
# 167.854 173.706 176.6315 181.019 279.025   100

microbenchmark(merge(d[ ,1, drop=F], s, "Batch"))

# Unit: microseconds
#     min       lq   median       uq      max neval
# 983.353 1060.149 1068.195 1103.302 2181.004   100

旁注,如果您有大型表,则应考虑data.table进行合并,因为在某些情况下,这可能比match更快。