R中for循环中的2个变量

时间:2016-01-05 14:50:57

标签: r for-loop

我想在for循环中引用两个向量,但每个向量的长度都不同。

n=1:50
m=letters[1:14]

我尝试了一个循环来阅读它

for (i in c(11:22,24,25)){
    cat (paste(n[i],m[i],sep='\t'),sep='\n')
}

结束了:

11  k
12  l
13  m
14  n
15  NA
16  NA
17  NA
18  NA
19  NA
20  NA
21  NA
22  NA
24  NA
25  NA

但我想获得:

11  a
12  b
13  c
...
25  n

有没有办法让双变量声明?

for (i in c(11:22,24,25) and j in 1:14){
    cat (paste(n[i],m[j],sep='\t'),sep='\n')
}

或类似的东西得到我想要的结果?

3 个答案:

答案 0 :(得分:4)

不,没有。但你可以这样做:

ind_j <- c(11:22,24,25)
ind_k <- 1:14
for (i in seq_along(ind_j)){
  cat (paste(n[ind_j[i]],m[ind_k[i]],sep='\t'),sep='\n')
}

当然,非常很可能您不应该使用for循环来解决实际问题。

答案 1 :(得分:0)

如果您希望m在结束时重新开始,您可以利用R中的回收。

cat(paste(n, m, sep='\t', collapse='\n'), '\n')

当达到m的结尾时,它将重新开始直到n的所有元素都被迭代完毕。如果您需要循环,请将cat替换为for循环。

答案 2 :(得分:0)

你的问题在于在for (i in c(11:22,24,25)中为i分配值 - 这会将值11,12,13,14,15 ....分配给i。 那么你想得到m [i]的值。 但要记住:m [i]只有1..14项,所以对于项目15及以上 - 你会得到NAs

也许这就是你想要的 - 这里有更强大的答案和@Roland的更好但是imho - 这可以解决你的问题,而无需改变你的初始方法

for (i in c(1:12,14,15)){cat (paste(n[i],m[i],sep='\t'),sep='\n')}

如果你只是从序列中减去10 - 索引问题就会消失,你会得到

1   a
2   b
3   c
4   d
5   e
6   f
7   g
8   h
9   i
10  j
11  k
12  l
14  n
15  o