R:将数据集中的值除以另一个值,该值在满足某些条件时会发生变化

R:将数据集中的值除以另一个值,该值在满足某些条件时会发生变化,r,data.table,R,Data.table,我有一个由生成的数据集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)) 我必须将SRM行的ratio1列中报

我有一个由生成的数据集
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))
我必须将
SRM
行的
ratio1
列中报告的值除以一个固定数字
a=1.9
。然后,我必须将
SAM
行的
ratio1
列中报告的值除以“周围”
SRM/a
值的平均值


举个例子:在
id
1和5有两个
SRM
样本,我计算
avg1我找到了这个可能的解决方案:

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)
库(data.table)
a=1.9
b=0.91
df
df$ratio.corr <- rep(NA, 9)
df$ratio1.corr[c(2:4)] <- df$ratio1[c(2:4)]/avg1
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)