我希望将一大组缩放因子应用于数据框,这些因子特定于样本来自的组,特别是样本的每个变量。我试图为这个问题构建一个最小的例子。
缩放因素
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))
答案 0 :(得分:5)
如果你采用合并方式而不是使用申请系列会更容易,我认为(s
是scaling_factors_example
,d
是data_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
更快。