peter
peter

Reputation: 786

Update values conditionally in for loop

I wondered why I can't replicate the first example with a for loop. More specifically you can see that if we try to execute the logic with a for loop the second and third row are not populated with a new value. Why is this?

example to copy:

df <- data.table(name=c('a', 'b', 'c'))

df[name=='a', x:=1]
df[name=='b', x:=2]
df[name=='c', x:=3]

df

####

df <- data.table(name=c('a', 'b', 'c'))

values <- unique(df$name)

for (x in 1:3) {
  df[name==values[x], x:=x]
}

df

my output:

> df <- data.table(name=c('a', 'b', 'c'))
> df[name=='a', x:=1]
> df[name=='b', x:=2]
> df[name=='c', x:=3]
> df
   name x
1:    a 1
2:    b 2
3:    c 3
> df <- data.table(name=c('a', 'b', 'c'))
> values <- unique(df$name)
> for (x in 1:3) {
+   df[name==values[x], x:=x]
+ }
> df
> df
   name  x
1:    a  1
2:    b NA
3:    c NA

Upvotes: 0

Views: 32

Answers (1)

Waldi
Waldi

Reputation: 41220

This is a scope problem, the first step in the loop defines x, and subsequent steps use this definition (which is equal to NA for rows 2 and 3).

If you use i instead of x, it works :

for (i in 1:3) {
  df[name==values[i], x:=i]
}

df
Index: <name>
     name     x
   <char> <int>
1:      a     1
2:      b     2
3:      c     3

Upvotes: 2

Related Questions