循环/应用函数逐个运行两个或多个列表

时间:2015-11-03 23:11:51

标签: r loops ggplot2

假设我有一个用户定义的乐趣

fun <- function(i,j,k){}

我正在寻找一个函数(),

function(fun, c(x1, x2), c(y1,y2), c(z1,z2))

执行

fun(x1,y1,z1)
fun(x1,y2,z1)
fun(x2,y1,z1)
fun(x2,y2,z1)    
fun(x1,y1,z2)
fun(x1,y2,z2)
fun(x2,y1,z2)
fun(x2,y2,z2)

我虽然申请家人可以做这个工作。但是我找不到合适的人。

=============================================== ======================

这是我正在研究的一个真实例子,但仍然无法解决。

data <- read.table(header = TRUE, stringsAsFactors = FALSE,
                   text = "ID x1 x2  y1  y2
                   1   a  T 100  2
                   2   b  T 210  4
                   3   b  F 112  5
                   4   a  F 121  1
                   5   b  F 412  1")

boxplot <- function(i,j){
  print(ggplot(data, 
               aes_string(x=colnames(data)[i], 
                   y=colnames(data)[j],
                   col=colnames(data)[i]))+
                 geom_boxplot())
}

然后您可以使用boxplot(2,4)制作绘图,boxplot(3,4),boxplot(2,5),boxplot(3,5)也是如此。

然后我尝试了do.call并从答案中应用方法。

do.call(boxplot, as.list(unname(expand.grid(c(2, 3), c(4,5)))))

apply(expand.grid(c(2,3), c(4,5)),1,boxplot)
然而,它们没有按预期工作。 do.call方法只返回一个绘图,而apply one会返回8个绘图,但所有y轴都是ID。

=============================================== =======

for循环使它工作。有什么意见吗?

for (i in 2:3) {
  for (j in 4:5) {
  boxplot(i,j)
  }
}

3 个答案:

答案 0 :(得分:2)

试试这个:

sum3 <- function(x, y, z) x+y+z  # test function
mapply(sum3, 1:3, 11:13, 21:23)
## [1] 33 36 39

此处sum3(1, 11, 21)为33,sum3(2, 12, 22)为36,sum3(3, 13, 23)为39. ?mapply帮助页面上有更多示例。

这也有效并返回一个列表:

Map(sum3, 1:3, 11:13, 21:23)

答案 1 :(得分:1)

x如果你提供reproducible example会很好,所以我们可以验证可能的解决方案,但我认为你可以通过exapand.griddo.call得到你想要的。 <怎么样

do.call(fun, as.list(unname(expand.grid(c(x1, x2), c(y1,y2), c(z1,z2)))))

如果你有

fun <- function(i,j,k){i+j+k}
x1<-1; x2<-2;
y1<-10; y2<-20;
z1<-100; z2<-200;

你会得到

[1] 111 112 121 122 211 212 221 222
# x1+y1+z1, x2+y1+z1, x1+y2+z1, x2+y3+z1, ...

答案 2 :(得分:0)

如果我理解正确,这应该很简单

apply(expand.grid(c(x1, x2), c(y1,y2), c(z1,z2)),1,fun)

编辑:添加示例

x <-c(13,14)
y <- c(21,22)
z<- c(35,36)
apply(expand.grid(x,y,z),1,mean)
[1] 23.00000 23.33333 23.33333 23.66667 23.33333 23.66667 23.66667 24.00000