3

我是新手R,我想问以下问题。

我有一组包含 2 列的 data.frame,我想将一个函数应用于 eac data.frame,而无需每次都输入 data.frame 的名称,即:

data.frames 将是:a, b, c, d, ......... 并且每个 data.frame 有 2 列具有不同的行长:

 a[1:4]
V1         V2
1   877.0578   609.0308
2   989.5682   160.1206
3  1049.5844   143.2906
4  1111.5798   214.5290

我想将以下函数应用于每个 data.frame,这是我想应用的函数

  as.MassPeaks <- function(x) {return(createMassPeaks(mass=mass(x), intensity=intensity(x),metaData=metaData(x)))}

我有一个包含所有 data.frame 名称的向量(名称)我尝试了以下代码,但它没有用

 for(i in length(names)){
    assign(i, createMassPeaks(mass=i[, 1], intensity=i[, 2]))
    }

但是,当我尝试使用单个 data.frame 时,它​​可以工作

 p <- createMassPeask(mass=a[,1], intensity=[, 2])
4

2 回答 2

2

for失败是因为您忘记使用get功能

library(MALDIquant)  # You should write what package is used

`Names <- c('a', 'b','c')` # this a vector of names

for(i in Names){
  assign(i, createMassPeaks(mass=get(i)[, 1], intensity=get(i)[, 2]))
}

这个循环应该可以工作。让我们测试一下

set.seed(001)
a <- data.frame(V1=rnorm(50, 1000, 50), V2=rnorm(50, 1000, 50))
b <- data.frame(V1=rnorm(50, 1000, 50), V2=rnorm(50, 1000, 50))
c <- data.frame(V1=rnorm(50, 1000, 50), V2=rnorm(50, 1000, 50))

结果如下所示:

> a
S4 class type            : MassPeaks           
Number of m/z values     : 50                  
Range of m/z values      : 889.265 - 1079.764  
Range of intensity values: 9.098e+02 - 1.12e+03
> b
S4 class type            : MassPeaks            
Number of m/z values     : 50                   
Range of m/z values      : 904.282 - 1104.358   
Range of intensity values: 9.256e+02 - 1.115e+03
> c
S4 class type            : MassPeaks            
Number of m/z values     : 50                   
Range of m/z values      : 855.554 - 1124.883   
Range of intensity values: 8.798e+02 - 1.132e+03

尽管这个for循环运行良好,@David Robinson 的回答是最好的。我还想说一件事,我觉得你的函数应该是这样的:

as.MassPeaks <- function(x) {
  return(createMassPeaks(mass=x[, 1], 
                         intensity=x[, 2],
                         metaData=x))}

mass=x[, 1]有效但mass=mass(x[, 1])无效,对于instensityand 也是如此metaData。然后使用大卫罗宾逊的方法,你应该得到:

lapply(list(a,b,c), as.MassPeaks)
[[1]]
S4 class type            : MassPeaks           
Number of m/z values     : 50                  
Range of m/z values      : 889.265 - 1079.764  
Range of intensity values: 9.098e+02 - 1.12e+03

[[2]]
S4 class type            : MassPeaks            
Number of m/z values     : 50                   
Range of m/z values      : 904.282 - 1104.358   
Range of intensity values: 9.256e+02 - 1.115e+03

[[3]]
S4 class type            : MassPeaks            
Number of m/z values     : 50                   
Range of m/z values      : 855.554 - 1124.883   
Range of intensity values: 8.798e+02 - 1.132e+03
于 2012-09-14T16:15:12.130 回答
2

您想将数据框放入列表中,然后用于lapply创建列表:

data.frames = list(a, b, c, d)
mass.peaks.each = lapply(data.frames, as.MassPeaks)

现在mass.peaks.each是每个结果的列表。

顺便说一句,我认为您想更改as.MassPeaks为:

  as.MassPeaks <- function(x) {return(createMassPeaks(mass=mass(x[, 1]), intensity=intensity(x[, 2]),metaData=metaData(x)))}
于 2012-09-14T15:48:28.400 回答