R:使用 for 循环修改 data.table 中现有变量的问题;循环不影响行过滤
R: Problem using a for loop to modify existing variables in a data.table; the loop does not affect the row filtering
我要完成的任务如下:
我有一个包含数百个变量的数据集。我需要按照相同的逻辑重新编码所有这些。逻辑如下:如果 GIVEN VARIABLE == 0 & a SPECIFIC VARIABLE == 1,则 GIVEN VARIABLE 必须= -1。 SPECIFIC VARIABLE 对它们都是一样的。
我所做的如下:
set.seed(123)
data=data.table(a = 0:10, b= 0:10, c = 0:10, d = 1:0)
此处“d”是特定变量,a:c是给定变量
list_variables <- names(data)
list_variables_v2 <- list_variables[-c(4)]
我从数据集中提取了变量的名称(减去 d)并将它们放在一个列表中,这样它们就可以被送入循环
data_v1 = copy(d)
for(i in (list_variables_v2)) {
data_v1[(i) == 0 & d == 1, (i) := -1]
}
有问题的是,当我 运行 循环时什么也没有发生。那些符合条件的变量(例如 a == 0 & d == 1)不会重新编码为 -1。可能会发生各种问题,但我想我已将它们减少为一个。潜在问题:
a) 即使在循环之外,代码也不起作用。但是这是错误的。以下代码产生预期结果:
data_v1[a == 0 & d == 1, a := -1]
b) 循环不工作,因此,变量名没有真正排序和识别。尽管如此,如果我排除 (i) == 0 条件,代码确实有效,这意味着循环适用于右侧:
for(i in (list_variables_v2)) {
data_v1[d == 1, (i) := -1]
}
我认为问题的根源在于行过滤端的 R 没有将 (i) == 0 识别为例如a == 0。这很奇怪,因为 R 在处理右侧(列)时确实将 (i) := -1 识别为例如一个:= -1。知道是什么原因造成的吗?希望如何解决?
再次非常感谢,如果有不清楚或重复的地方,请告诉我。
一个简单的更正是用 get
换行
for(i in (list_variables_v2)) {
data_v1[get(i) == 0 & d == 1, (i) := -1]
}
-输出
> data_v1
a b c d
<int> <int> <int> <int>
1: -1 -1 -1 1
2: 1 1 1 0
3: 2 2 2 1
4: 3 3 3 0
5: 4 4 4 1
6: 5 5 5 0
7: 6 6 6 1
8: 7 7 7 0
9: 8 8 8 1
10: 9 9 9 0
11: 10 10 10 1
> data
a b c d
<int> <int> <int> <int>
1: 0 0 0 1
2: 1 1 1 0
3: 2 2 2 1
4: 3 3 3 0
5: 4 4 4 1
6: 5 5 5 0
7: 6 6 6 1
8: 7 7 7 0
9: 8 8 8 1
10: 9 9 9 0
11: 10 10 10 1
我要完成的任务如下: 我有一个包含数百个变量的数据集。我需要按照相同的逻辑重新编码所有这些。逻辑如下:如果 GIVEN VARIABLE == 0 & a SPECIFIC VARIABLE == 1,则 GIVEN VARIABLE 必须= -1。 SPECIFIC VARIABLE 对它们都是一样的。
我所做的如下:
set.seed(123)
data=data.table(a = 0:10, b= 0:10, c = 0:10, d = 1:0)
此处“d”是特定变量,a:c是给定变量
list_variables <- names(data)
list_variables_v2 <- list_variables[-c(4)]
我从数据集中提取了变量的名称(减去 d)并将它们放在一个列表中,这样它们就可以被送入循环
data_v1 = copy(d)
for(i in (list_variables_v2)) {
data_v1[(i) == 0 & d == 1, (i) := -1]
}
有问题的是,当我 运行 循环时什么也没有发生。那些符合条件的变量(例如 a == 0 & d == 1)不会重新编码为 -1。可能会发生各种问题,但我想我已将它们减少为一个。潜在问题:
a) 即使在循环之外,代码也不起作用。但是这是错误的。以下代码产生预期结果:
data_v1[a == 0 & d == 1, a := -1]
b) 循环不工作,因此,变量名没有真正排序和识别。尽管如此,如果我排除 (i) == 0 条件,代码确实有效,这意味着循环适用于右侧:
for(i in (list_variables_v2)) {
data_v1[d == 1, (i) := -1]
}
我认为问题的根源在于行过滤端的 R 没有将 (i) == 0 识别为例如a == 0。这很奇怪,因为 R 在处理右侧(列)时确实将 (i) := -1 识别为例如一个:= -1。知道是什么原因造成的吗?希望如何解决?
再次非常感谢,如果有不清楚或重复的地方,请告诉我。
一个简单的更正是用 get
for(i in (list_variables_v2)) {
data_v1[get(i) == 0 & d == 1, (i) := -1]
}
-输出
> data_v1
a b c d
<int> <int> <int> <int>
1: -1 -1 -1 1
2: 1 1 1 0
3: 2 2 2 1
4: 3 3 3 0
5: 4 4 4 1
6: 5 5 5 0
7: 6 6 6 1
8: 7 7 7 0
9: 8 8 8 1
10: 9 9 9 0
11: 10 10 10 1
> data
a b c d
<int> <int> <int> <int>
1: 0 0 0 1
2: 1 1 1 0
3: 2 2 2 1
4: 3 3 3 0
5: 4 4 4 1
6: 5 5 5 0
7: 6 6 6 1
8: 7 7 7 0
9: 8 8 8 1
10: 9 9 9 0
11: 10 10 10 1