R中的循环不工作,生成单个值

j2qf4p5b  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(117)

我有一些代谢组学数据要处理(验证实际存在的化合物)。

`'data.frame':  544 obs. of  48 variables:
 $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
 $ No.              : int  2 32 34 95 114 141 169 234 236 278 ...
 $ RT..min.         : num  0.89 3.921 0.878 2.396 0.845 ...
 $ Molecular.Weight : num  70 72 72 78 80 ...
 $ m.z              : num  103 145 114 120 113 ...
 $ HMDB.ID          : chr  "HMDB0006804" "HMDB0031647" "HMDB0006112" "HMDB0001505" ...
 $ Name             : chr  "Propiolic acid" "Acrylic acid" "Malondialdehyde" "Benzene" ...
 $ Formula          : chr  "C3H2O2" "C3H4O2" "C3H4O2" "C6H6" ...
 $ Monoisotopic_Mass: num  70 72 72 78 80 ...
 $ Delta.ppm.       : num  1.295 0.833 1.953 1.023 0.102 ...
 $ X1               : num  288.3 16.7 1130.9 3791.5 33.5 ...
 $ X2               : num  276.8 13.4 1069.1 3228.4 44.1 ...
 $ X3               : num  398.6 19.3 794.8 2153.2 15.8 ...
 $ X4               : num  247.6 100.5 1187.5 1791.4 33.4 ...
 $ X5               : num  98.4 162.1 1546.4 1646.8 45.3 ...`

我尝试编写一个循环,以便如果Δ ppm值大于(m/z -分子量)/分子量,则在后续 Dataframe 中删除整行。

for (i in 1:nrow(rawdata)) {
  ppm <- (rawdata$m.z[i] - rawdata$Molecular.Weight[i]) / 
rawdata$Molecular.Weight[i]

  if (ppm > rawdata$Delta.ppm[i]) {

    filtered_data <- rbind(filtered_data, rawdata[i,])
  }
}

在“Values”部分下,它没有给我一个包含已验证化合物的新df,而是为“ppm”生成了一个数字。
对R还是很陌生的,任何帮助都是超级感激的!

rggaifut

rggaifut1#

1.不需要逐行执行此操作,我们可以在一个操作中删除所有不需要的行:

## base R
good <- with(rawdat, (m.z - Molecular.Weight)/Molecular.Weight < Delta.ppm.)
newdat <- rawdat[good, ]
## dplyr
newdat <- filter(rawdat, (m.z - Molecular.Weight)/Molecular.Weight < Delta.ppm.)

1.使用rbind(old, newrow)向帧中迭代添加行在实践中是可行的,但是扩展性 * 非常可怕 *,请参见The R Inferno中的“增长对象”。对于添加的每一行,它都会创建old中所有行的完整副本,这一方法可以工作,但是开始会变慢很多。最好生成这些新行的列表,然后一次对它们进行rbind;例如,

out <- list()
for (...) {
  # ... newrow ...
  out <- c(out, list(newrow))
}
alldat <- do.call(rbind, out)
q8l4jmvw

q8l4jmvw2#

ppm[i] <- NULL

for (i in 1:nrow(rawdata)) {
  ppm[i] <- (rawdata$m.z[i] - rawdata$Molecular.Weight[i]) / 
rawdata$Molecular.Weight[i]

  if (ppm[i] > rawdata$Delta.ppm[i]) {

    filtered_data <- rbind(filtered_data, rawdata[i,])
  }
}

相关问题