在 for 循环中有条件地更新值
Update values conditionally in for loop
我想知道为什么我不能用 for 循环复制第一个例子。更具体地说,您可以看到,如果我们尝试使用 for 循环执行逻辑,则第二行和第三行不会填充新值。这是为什么?
要复制的示例:
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
我的输出:
> 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
这是一个作用域问题,循环的第一步定义了x
,后续步骤使用这个定义(对于第2行和第3行等于NA
)。
如果您使用 i
而不是 x
,它会起作用:
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
我想知道为什么我不能用 for 循环复制第一个例子。更具体地说,您可以看到,如果我们尝试使用 for 循环执行逻辑,则第二行和第三行不会填充新值。这是为什么?
要复制的示例:
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
我的输出:
> 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
这是一个作用域问题,循环的第一步定义了x
,后续步骤使用这个定义(对于第2行和第3行等于NA
)。
如果您使用 i
而不是 x
,它会起作用:
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