R使用mapply替换嵌套循环

时间:2014-08-08 19:49:15

标签: r

我正在尝试使用mapply来替换嵌套循环。

我有一个数据框:

a <-rnorm(20)
b <-rnorm(20)
c <-rnorm(20)
d <-rnorm(20)
e <-rnorm(20)
f <-rnorm(20)

df <- data.frame(a,b,c,d,e,f)
df

我也有一个功能:

fnsum <-function(num1,num2)
{
 dsum <- sum(df[,num1],df[,num2])
 idx <- names(df[num1])
 idy <- names(df[num2])
 dsum1 <- data.frame(idx,idy,dsum)
 dsum1 
 return(dsum1)
}

我可以在嵌套循环中使用此函数来获得答案:

len1 <- 6
dsumall <- fnsum(1,2)
for (n in 2:(len1-1)) {
    for (m in (n+1):len1) {

dsumall  <- rbind(dsumall ,fnsum(n,m))

}
}

dsumall 

但我遇到的问题是为适用于任何规模的数据帧的通用解决方案而工作:

dsumall <- mapply(fnsum, n = 1:(len1-1), m = (n+1):len1)
dsumall 

我很感激你的帮助。

1 个答案:

答案 0 :(得分:2)

试试这个:

num2 <- unlist(mapply(seq,from = 3:6,length.out = 4:1))
dsumall1 <- mapply(fnsum, 
                   num1 = c(1,rep(2:5,times = 4:1)), 
                   num2 = c(2,num2),
                   SIMPLIFY = FALSE)
do.call("rbind",dsumall1)