避免在R中循环

时间:2014-04-22 08:34:50

标签: r

我是R的基础级别。通过apply重写循环更好。但是对于以下问题,我不知道如何实现这一目标。有人可以帮忙吗?或者推荐一些类似的例子?

    data(iris)  ## iris is a dataframe
    n <- ncol( iris )
    for ( i in 1: (n-1) ) 
   {
      subSet <- iris[, c(i, n)] ## extract the ith column and last column for analysis
      result <- someFunction( subSet ) ## analyze on the subset
      score[i] <- result$score
  splitVal[i] <- result$splitVal
   }

3 个答案:

答案 0 :(得分:1)

您可以轻松地使用sapply执行此操作:

data(iris)
someFunction <- function(x) {
  list(score = mean(x[,1]),
       splitVal = median(x[,1]))
}
n <- ncol( iris )
sapply(1:(n-1), function(i, dataset, n){
  subSet <- dataset[, c(i, n)] ## extract the ith column and last column for analysis
  result <- someFunction( subSet ) ## analyze on the subset
  c(score = result$score, 
        splitVal = result$splitVal)
}, dataset = iris, n=n)

它将返回结果:

             [,1]     [,2]  [,3]     [,4]
score    5.843333 3.057333 3.758 1.199333
splitVal 5.800000 3.000000 4.350 1.300000

虽然应用也可以这样做,因为这样可以通过使用lapply轻松切换到并行编程

答案 1 :(得分:0)

尝试

apply(iris[,-n], 2, someFunction, paramFUN=iris[,n])

其中someFunction应该有一列iris[,i]的主要参数和一个次要参数(我表示为paramFUN)的列iris[,n]

如果不是这种情况且主参数必须是包含两列的data.frame,则可以使用漏洞。

bindandfun <- function(x, y){   
  auxdf <- cbind(x,y) 
  #   
  res <- someFunction(auxdf)   
  return(res) 
}

apply(iris[,-n], 2, bindandfun, y=iris[,n])

要小心这些课程。 auxdf将是一个矩阵。我需要,您可以在我标记#的位置添加一些行来更改auxdf的类,并将第二列转换为因子。

答案 2 :(得分:0)

很多时候读者,第一次回答!

为什么不重新定义newFn输入一列数据集,第二列在fn中给出。因此x将是data[,j]

newFn = function(x){

      use = cbind(x,data[,n]) # create your 2-columned matrix
      answer = SomeFn(use)   # now apply the fn you created
}

然后

sapply(data[,-n], newFn)