基于 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
正在关注 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