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

基于data.R表中的两列创建分类变量,r,data.table,categories,R,Data.table,Categories,以下是数据表 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

以下是数据表

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
原始的
data.table
更大,有数千行。
var2
中“yes”的目标值是多个彼此未连接的随机值,因此我可能必须使用
c()
手动键入它们。 非常感谢您在
data.table
中提供的帮助。到目前为止,我尝试在%中使用
%,但不知道如何在两列中应用它。以前,我只在一个专栏中使用过它。

谢谢

您只需使用数据即可。否则,表的速度很快。我把它分开,以便更容易地阅读正在发生的事情。你必须使用一些布尔逻辑来得到你想要的

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

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


not_zero_nn您的结果与您的陈述不一致。在两个条件之间是否需要“and”或“or”?此外,结果数据帧与输入不同。很难辨别你想要的是真的,想要的是假的。你怎么写
和/或
?这些条件完全不同,不能互换。此外,输入中显示的数据与输出中显示的数据不同。你能验证/确认哪一个是正确的吗?
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
    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