生成的dataset df
df <- data.frame(
id = seq(1:9),
sample = c("SRM1", "SAM1", "SAM2", "SAM3", "SRM2", "SAM4", "SAM5", "SRM3", "SRM4"),
ratio1 = rnorm(9, mean = 2, sd = 0.02),
ratio2 = rnorm(9, mean = 1, sd = 0.01))看起来就像
id sample ratio1 ratio2
1 SRM1 2.0271 0.99915
2 SAM1 2.0241 0.98810
3 SAM2 1.9522 1.00300
4 SAM3 1.9877 1.00343
5 SRM2 1.9800 1.00522
6 SAM4 2.0184 0.97788
7 SAM5 2.0045 1.00549
8 SRM3 1.9684 0.99129
9 SRM4 2.0034 1.00310我必须将ratio1列中为SRM行报告的值除以一个固定数字a = 1.9。然后,我必须将ratio1列中为SAM行报告的值除以“周围”SRM/a值的平均值。
举一个例子:在id 1和5有两个SRM样本,我计算avg1 <- mean(2.2701, 1.9800)/a。在这一点上,我可以计算
df$ratio.corr <- rep(NA, 9)
df$ratio1.corr[c(2:4)] <- df$ratio1[c(2:4)]/avg1对于SAM4和SAM5,avg2将被计算为SRM2和SRM3样本的ratio1值的平均值。
对于带有id = 10的假设id = 10,avg3将计算为为SRM4报告的ratio1值与带有id = 11的假设SRM5样本之间的平均值。
请考虑:
avg值总是针对用字符串SRM标识的样本计算的;SRM示例有许多不同的名称,没有公共字符串;SRM的距离可能有所不同(有时为3行、4行甚至0行)ratio2列也需要类似的操作,但是使用b = 0.91而不是a。我简直快疯了。
发布于 2017-02-27 18:24:02
我找到了这个可能的解决办法:
library(data.table)
a = 1.9
b = 0.91
df <- as.data.table(df)
# SRMs
srm <- grep("SRM", df$sample)
# SAMs between consecutive SRMs
sam <- diff(srm)-1
# Splitting df in SRMs and SAMs
df.srm <- df[srm][, id := 1:.N]
df.sam <- df[-srm]
# For each SAMs I write the IDs of the SRMs before and after it
srm1 <- rep(df.srm$id[-length(df.srm$id)], sam)
srm2 <- srm1 + 1
df.sam <- df.sam[, ':=' (srm1 = srm1, srm2 = srm2)]
# Calculating ratio1/a and ratio2/b
df.srm[, ':=' (ratio1.a = ratio1/a, ratio2.b = ratio2/b)]
# Calculating ratios for each SAMs divided by the average of srm1 and srm2
df.sam$ratio1.ok <- df.sam$ratio1/((df.srm$ratio1.a[df.sam$srm1] + df.srm$ratio1.a[df.sam$srm2])/2)
df.sam$ratio2.ok <- df.sam$ratio2/((df.srm$ratio2.b[df.sam$srm1] + df.srm$ratio2.b[df.sam$srm2])/2)这似乎是可行的,但我认为最后两行有点混乱。你知道如何改进代码吗?
https://stackoverflow.com/questions/42401421
复制相似问题