对于循环,在R中依次绘制两个输出

时间:2016-07-11 16:24:33

标签: r for-loop lapply

我试图编写一个双for循环来按顺序绘制两个输出。

基于以下两个向量:

vec.a <- c("a1", "a2", "a3")
vec.b <- c("b1", "b2", "b3")

我尝试了第一个循环:

for (i in vec.a){
    cat(i)
    for (j in vec.b){
        cat(j, "| ")
    }
}

输出结果为:

a1b1 | b2 | b3 | a2b1 | b2 | b3 | a3b1 | b2 | b3 |

我尝试了第二个循环:

for (i in vec.a){
    for (j in vec.b){
        cat(i)
        cat(j, "| ")
    }
}

输出结果为:

a1b1 | a1b2 | a1b3 | a2b1 | a2b2 | a2b3 | a3b1 | a3b2 | a3b3 |

但所需的输出是:

a1b1 | a2b2 | a3b3

怎么做?

更新

我想比较两个数据帧的相同位置的列之间的图形。但显示的顺序并不是我想要的。我认为逻辑与上面的例子相同。

set.seed(99)
df.a <- matrix(rnorm(50), 10, 10,  # 10 rows and 10 columns
           dimnames=list(paste("p", 1:10, sep = ""), 
                         paste("sp.A", 1:10, sep = ""))) 

df.b <- matrix(rnorm(50), 20, 10,  # 20 rows and 10 columns
           dimnames=list(paste("p", 1:20, sep = ""), 
                         paste("sp.B", 1:10, sep = ""))) 

为了比较图形,我使用了这样的东西:

par(mfrow = c(1,2))
invisible(lapply(colnames(df.a[ ,1:ncol(df.a)]), function(x){
   invisible(lapply(colnames(df.b[ ,1:ncol(df.b)]), function(w){
     plot(df.a[ ,x], main = x) 
     plot(df.b[ ,w], main = w)
   }))
}))

如何绘制与df.a的第一列配对的df.b的第一列,依此类推?

2 个答案:

答案 0 :(得分:1)

在这里,我们将两个矢量粘贴在一起,这将逐个单元地绑定它们。我们将所有单元格绑定在一起以创建一个单独的字符串,使用&#34; | &#34;作为崩溃参数。

# Creating the vectors
vec.a <- c("a1", "a2", "a3")
vec.b <- c("b1", "b2", "b3")

# Creating the output
paste(vec.a,vec.b,sep="",collapse=" | ")

输出:

"a1b1 | a2b2 | a3b3"

答案 1 :(得分:1)

根据您的评论,我认为您正在寻找mapply

mapply(FUN = cat, vec.a, vec.b, MoreArgs = list("| ", sep = ""))

将上面的invisible()包裹起来会抑制mapply

的输出
invisible(mapply(FUN = cat, vec.a, vec.b, MoreArgs = list("| ", sep = "")))

使用for循环的解决方案: 以下代码生成相同的输出,但使用for循环

for (i in seq_along(vec.a)){
   cat(vec.a[i], vec.b[i], "|", sep = "")
}

更新问题的解决方案

set.seed(99)
df.a <- matrix(rnorm(50), 10, 10,  # 10 rows and 10 columns
               dimnames=list(paste("p", 1:10, sep = ""), 
                             paste("sp.A", 1:10, sep = ""))) 

df.b <- matrix(rnorm(50), 20, 10,  # 20 rows and 10 columns
               dimnames=list(paste("p", 1:20, sep = ""), 
                             paste("sp.B", 1:10, sep = ""))) 
par(mfrow = c(1,2))
for (i in 1:ncol(df.a)){
  plot(df.a[ ,i], main = i) 
  plot(df.b[ ,i], main = i)
}