3

私は初心者Rです。次の質問をしたいと思います。

2列のdata.framesのグループがあり、毎回data.frameの名前を入力せずに、eacdata.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

データフレームをリストに入れ、それからリスト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 に答える
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の答えは最高のものです。もう1つ言いたいのですが、関数は次のようになるはずです。

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

mass=x[, 1]動作しますがmass=mass(x[, 1])動作しません。 と についても同じinstensityですmetaData。次に、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
于 2012-09-14T16:15:12.130 に答える