frank
frank

Reputation: 3598

2 variables in a for loop in R

I have two vectors that I would like to reference in a for loop, but each is of different lengths.

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

I tried a single loop to read it

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

and ended up with:

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

but I would like to obtain:

11  a
12  b
13  c
...
25  n

is there a way to have a double variable declaration?

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

or something similar to get the result I want?

Upvotes: 3

Views: 7158

Answers (3)

Zahiro Mor
Zahiro Mor

Reputation: 1718

your problem lies in assigning the values to i in for (i in c(11:22,24,25) - this assigns the values 11,12,13,14,15 .... to i. then you want to get the values of m[i]. but remember: m[i] has only 1..14 items so for item 15 and above - you'll get NAs

maybe this is what you wanted - there are more robust answers here and @Roland's is far better but imho - this fixes your problem without changing your initial approach

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

if you just subtract 10 from your sequence - the indexing problem will go away and u'll get

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

Upvotes: 0

Pete A
Pete A

Reputation: 34

If you want m to start over when it has reached the end, you can take advantage of recycling in R.

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

When the end of m is reached, it will start over until all elements of n have been iterated over. If you need this in a loop, replace cat with a for loop.

Upvotes: 0

Roland
Roland

Reputation: 132576

No there isn't. But you can do this:

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')
}

Of course, it's very probable that you shouldn't use a for loop for your actual problem.

Upvotes: 5

Related Questions