我是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
}
答案 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)