首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:将数据集中的值除以满足某些条件时更改的另一个值。

R:将数据集中的值除以满足某些条件时更改的另一个值。
EN

Stack Overflow用户
提问于 2017-02-22 20:17:23
回答 1查看 221关注 0票数 0

生成的dataset df

代码语言:javascript
复制
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))

看起来就像

代码语言:javascript
复制
 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。在这一点上,我可以计算

代码语言:javascript
复制
df$ratio.corr <- rep(NA, 9)
df$ratio1.corr[c(2:4)] <- df$ratio1[c(2:4)]/avg1

对于SAM4SAM5avg2将被计算为SRM2SRM3样本的ratio1值的平均值。

对于带有id = 10的假设id = 10avg3将计算为为SRM4报告的ratio1值与带有id = 11的假设SRM5样本之间的平均值。

请考虑:

  • 真正的数据集大约有10000行;
  • avg值总是针对用字符串SRM标识的样本计算的;
  • SRM示例有许多不同的名称,没有公共字符串;
  • 与连续SRM的距离可能有所不同(有时为3行、4行甚至0行)
  • 对于ratio2列也需要类似的操作,但是使用b = 0.91而不是a

我简直快疯了。

EN

回答 1

Stack Overflow用户

发布于 2017-02-27 18:24:02

我找到了这个可能的解决办法:

代码语言:javascript
复制
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)

这似乎是可行的,但我认为最后两行有点混乱。你知道如何改进代码吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42401421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档