2012-01-25 72 views
0

我试图把一个函数放在一起,这个函数将通过一个给定的数据框循环并返回一个新的数据帧,其中包含从原始计算的东西。 x的长度每次都会有所不同,实际的问题在函数中会有更多的循环。新十岁上下到R和一直没能找到什么有用的(我不认为使用名单将帮助)返回来自函数R的多个数据帧

func<-function(x){ 
    tmp # need to declare this here? 
    for (i in 1:dim(x)[1]){ 
     tmp[i]<-ave(x[i,]) # add things to it 
    } 
    return(tmp) 
} 
df<-cbind(rnorm(10),rnorm(10)) 
means<-func(df) 

此代码不工作,但我希望它跨越了我想做的事得到。谢谢!

+0

你的问题不是很清楚(对我而言)。您的标题暗示您想知道如何编写返回多个数据框的函数,但您的代码只会尝试返回一个数据框。我完全不理解你的循环策略的逻辑。也许如果你更详细地解释你实际上在做什么......? – joran

+0

夫妇的事情。 dim(x)[1]'可以是'nrow(x)'。你想找到每一行的平均值? 'apply(x,1,mean)'会做到这一点......但请看一下[plyr](http://cran.r-project.org/web/packages/plyr/index.html)分割data.frames和处理每一块。 – Justin

回答

3

你的意思是你想循环遍历df的每一行,并返回一个带有计算值的数据帧?

您可能希望寻找到apply功能:

df <- cbind(rnorm(10),rnorm(10)) 
# apply(df,1,FUN) does FUN(df[i,]) 
# e.g. mean of each row: 
apply(df,1,mean) 

对于更复杂的循环就像每个因素基础上进行一些操作,我强烈建议内包plyr,和功能ddply。快速举例:

df <- data.frame(gender=c('M','M','F','F'), height=c(183,176,157,168)) 
# find mean height *per gender* 
ddply(df,.(gender), function(x) c(height=mean(x$height))) 
# returns: 
    gender height 
1  F 162.5 
2  M 179.5 
+0

谢谢你的回应。我想做的事情(但没有在原来的问题中解释过,我希望能够在没有它的情况下指向正确的方向)根据其中一列的值抽出df块。 – user1168246

+0

它是一个排序的列,我将抓取所有的行,其0-1执行calc,1-2,2-3等。每次可能有不同数量的块,并且它们的长度都不相同。所以它的复杂性,我只需要一个更好的主意在哪里看,我可以从这个包开始。 (抱歉,双重评论,这里是新的) – user1168246

+1

在这种情况下,我认为plyr软件包将按照您的要求进行操作 - 它会根据列将您的数据框分成块,然后您可以编写处理每个块的函数。你只需要制作一个单独的列,说明每行的间隔(即将每行分成组0-1,1-2,...),然后使用“ddply”。 –