我是新手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])
答案 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])
不起作用,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