R:使用“for”循环和“case_when”检查多个变量

R:使用“for”循环和“case_when”检查多个变量,r,for-loop,case-when,R,For Loop,Case When,我的数据集DT如下所示: 类别:1-9号 xxx,yyy,zzz:二进制0,1 category xxx yyy zzz 8 1 0 0 1 0 0 0 4 0 1 1 9 0 0 1 8 0 1 0 我想使用“for”循环和“case_when”检查多个条件 因此,我希望数据在最后显示出来 category xxx yyy zzz result_xxx result_yyy

我的数据集DT如下所示: 类别:1-9号 xxx,yyy,zzz:二进制0,1

category xxx yyy zzz
8         1   0   0
1         0   0   0
4         0   1   1
9         0   0   1
8         0   1   0
我想使用“for”循环和“case_when”检查多个条件 因此,我希望数据在最后显示出来

category xxx yyy zzz result_xxx result_yyy result_zzz
8         1   0   0       8           0          0
1         0   0   0       0           0          0
4         0   1   1       0           4          4 
9         0   0   1       0           0          9 
8         0   1   0       0           8          0
为此,我编写了以下代码:

condition.vars <- c("xxx", "yyy", "zzz")

for(i in condition.vars){
  browser()
  DT <- DT[, condition:= case_when(
    ([[i]] == 1 & category ==1) ~ 1,
    ([[i]] == 1 & category ==2) ~ 2,
    ([[i]] == 1 & category ==3) ~ 3,
    ([[i]] == 1 & category ==4) ~ 4,
    ([[i]] == 1 & category ==5) ~ 5,
    ([[i]] == 1 & category ==6) ~ 6,
    ([[i]] == 1 & category ==7) ~ 7,
    ([[i]] == 1 & category ==8) ~ 8,
    ([[i]] == 1 & category ==9) ~ 9,
    TRUE ~ 0
  )]
  setnames(DT, "condition", paste0("result", i))
   
} 
正如你所预料的,它不起作用。 您能帮我更正代码吗?

您不需要for循环或case\u。如果您有一个数据帧,可以将其简化为:

condition.vars <- c("xxx", "yyy", "zzz")
DT[paste0('result_', condition.vars)] <- DT$category * DT[condition.vars]

#  category xxx yyy zzz result_xxx result_yyy result_zzz
#1        8   1   0   0          8          0          0
#2        1   0   0   0          0          0          0
#3        4   0   1   1          0          4          4
#4        9   0   0   1          0          0          9
#5        8   0   1   0          0          8          0
您不需要for循环或case_。如果您有一个数据帧,可以将其简化为:

condition.vars <- c("xxx", "yyy", "zzz")
DT[paste0('result_', condition.vars)] <- DT$category * DT[condition.vars]

#  category xxx yyy zzz result_xxx result_yyy result_zzz
#1        8   1   0   0          8          0          0
#2        1   0   0   0          0          0          0
#3        4   0   1   1          0          4          4
#4        9   0   0   1          0          0          9
#5        8   0   1   0          0          8          0
我们可以使用tidyverse

我们可以使用tidyverse

这里有一个data.table选项

   category xxx yyy zzz result_xxx result_yyy result_zzz
1:        8   1   0   0          8          0          0
2:        1   0   0   0          0          0          0
3:        4   0   1   1          0          4          4
4:        9   0   0   1          0          0          9
5:        8   0   1   0          0          8          0
这里有一个data.table选项

   category xxx yyy zzz result_xxx result_yyy result_zzz
1:        8   1   0   0          8          0          0
2:        1   0   0   0          0          0          0
3:        4   0   1   1          0          4          4
4:        9   0   0   1          0          0          9
5:        8   0   1   0          0          8          0

谢谢你@Ronak Shah。不知何故,第一个建议不起作用,但第二个建议起作用!我还需要从多个角度开发视觉数据。我能再问你一个问题吗?如果“category”不是数字而是字符,那么我不需要在什么时候使用case_吗?第一个用于数据帧,因为您有datatable,第二个答案就可以了。我仍然不会使用case_,因为对于角色,如果您有角色,可以使用lapply的其他方法。你可以有很多任意长度的字符。在这里不可行的情况下,一个接一个地写下每个条件。谢谢@Ronak Shah。不知何故,第一个建议不起作用,但第二个建议起作用!我还需要从多个角度开发视觉数据。我能再问你一个问题吗?如果“category”不是数字而是字符,那么我不需要在什么时候使用case_吗?第一个用于数据帧,因为您有datatable,第二个答案就可以了。我仍然不会使用case_,因为对于角色,如果您有角色,可以使用lapply的其他方法。你可以有很多任意长度的字符。在此处不可行时,使用案例_逐个编写每个条件。
   category xxx yyy zzz result_xxx result_yyy result_zzz
1:        8   1   0   0          8          0          0
2:        1   0   0   0          0          0          0
3:        4   0   1   1          0          4          4
4:        9   0   0   1          0          0          9
5:        8   0   1   0          0          8          0