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)