我在R中有一个表,如何在行中创建一个大于或等于某个数字a 1的值,其余的值为0.例如,如果我的特殊数字是4,那么我表中4和4以上的每个值都是1,其余值都是0。例如,然后这个表:
a b c d e
Bill 1 2 3 4 5
Susan 4 1 5 4 2
Malcolm 4 5 6 2 1
Reese 0 0 2 3 8
Would Turn Into
a b c d e
Bill 0 0 0 1 1
Susan 1 0 1 1 0
Malcolm 1 1 1 0 0
Reese 0 0 0 0 1
答案 0 :(得分:5)
我们可以创建TRUE/FALSE
的逻辑矩阵,并使用+
+(df1>=4)
# a b c d e
#Bill 0 0 0 1 1
#Susan 1 0 1 1 0
#Malcolm 1 1 1 0 0
#Reese 0 0 0 0 1
为了清楚起见,当我们执行>=
时,它会创建一个TRUE/FALSE
的逻辑矩阵
df1 >=4
# a b c d e
#Bill FALSE FALSE FALSE TRUE TRUE
#Susan TRUE FALSE TRUE TRUE FALSE
#Malcolm TRUE TRUE TRUE FALSE FALSE
#Reese FALSE FALSE FALSE FALSE TRUE
但是,OP希望将其转换为1/0
。通过将TRUE / FALSE强制转换为二进制形式,有很多方法可以做到这一点。一个选项是
(df1>=4) + 0L
或者
(df1>=4)*1L
或者只是放一个+
就可以进行强制攻击
+(df1>=4)
根据?TRUE
逻辑向量在上下文中被强制转换为整数向量 数值是必需的,'TRUE'映射到'1L', “FALSE”为“0L”,“NA”为“NA_integer _”。
我们也可以用as.integer
换行,但输出将是一个向量
as.integer(df1>=4)
#[1] 0 1 1 0 0 0 1 0 0 1 1 0 1 1 0 0 1 0 0 1
如果我们将输出分配回原始数据集,我们可以更改该数据集并保持其结构
df1[] <- as.integer(df1>=4)
df1
# a b c d e
#Bill 0 0 0 1 1
#Susan 1 0 1 1 0
#Malcolm 1 1 1 0 0
#Reese 0 0 0 0 1