将函数应用于R中的不同data.frames

时间:2012-09-14 15:41:40

标签: r dataframe

我是新手R,我想问下面的问题。

我有一组包含2列的data.frames,我想在每次都不输入data.frame的名称的情况下将函数应用于eac 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])

2 个答案:

答案 0 :(得分: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)))}

答案 1 :(得分: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])不起作用,instensitymetaData相同。然后使用David Robinson的方法,你应该得到:

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