基于 data.table R 中的两列创建分类变量

Create a categorical variable based on two columns in data.table R

正在关注 data.table

df <- data.table(id=c(1,2,3,4,5,6,7,8,9,10),
                 var1=c(0,4,5,6,99,3,5,5,23,0),
                 var2=c(22,4,6,25,6,70,75,23,24,21))
id var1 var2
1:  1    0   22
2:  2    4    4
3:  3    5    6
4:  4    6   25
5:  5   99    6
6:  6    3   70
7:  7    5   75
8:  8    5   23
9:  9   23   24
10: 10    0   21

我想为 var1 中 00 或 99 以外的任何数字创建一个二进制变量 'yes' var2 and/or 20 到 29 之间的任何数字],或'no'。结果如下

id var1 var2 cat
1:  1    0   22 yes
2:  2    4    4 yes
3:  3    5    6 yes
4:  4    6   25 yes
5:  5   99    6  no
6:  6    3   70 yes
7:  7    5   75 yes
8:  8    0   23 yes
9:  9   99   24 yes
10: 10    0    0  no

原始 data.table 更大,有数千行。 var2 中 'yes' 的目标值是多个彼此不相关的随机值,因此我可能不得不使用 c() 手动输入它们。 感谢 data.table 的帮助。到目前为止,我尝试使用 %in% 但不知道如何将它应用于两列。以前,我只将它用于一个专栏。 谢谢!

您可以只使用 data.table 的快速 ifelse。我将其拆分以便能够更轻松地阅读正在发生的事情。你必须使用一些布尔逻辑来得到你想要的。

您需要采用第一个条件(不在 0 或 99 中)并使用 | (或)运算符在 var1 或 var 2 条件下获得 true if true,然后您必须 & var 1 条件,以便第一列中的任何 0 或 99 都将产生 false,而不管 var2。这是下面的condition2

不清楚你想要什么。第二个条件似乎是您想要的,但由于您的结果与您输入的数据不匹配,我无法确定。您还说过 and/or 这在布尔上下文中并没有真正意义(它是一个或另一个)。

    not_zero_nn <- !(df$var1 %in% c(0, 99))
    condition <- not_zero_nn | (df$var2 %in% 20:29) 
    condition2 <- condition & not_zero_nn
    
    df[, cat := fifelse(condition, 'yes', 'no')]
    id var1 var2 cat
    # 1:  1    0   22 yes
    # 2:  2    4    4 yes
    # 3:  3    5    6 yes
    # 4:  4    6   25 yes
    # 5:  5   99    6  no
    # 6:  6    3   70 yes
    # 7:  7    5   75 yes
    # 8:  8    5   23 yes
    # 9:  9   23   24 yes
    # 10: 10    0   21 yes
    
    df[, cat := fifelse(condition2, 'yes', 'no')]
    id var1 var2 cat
    # 1:  1    0   22  no
    # 2:  2    4    4 yes
    # 3:  3    5    6 yes
    # 4:  4    6   25 yes
    # 5:  5   99    6  no
    # 6:  6    3   70 yes
    # 7:  7    5   75 yes
    # 8:  8    5   23 yes
    # 9:  9   23   24 yes
    # 10: 10    0   21  no