如何通过正确答案将因子更改为二进制数字?

时间:2017-09-04 13:42:16

标签: r

q1  q2  q3
C   B   D
1   B   C
D   1   B  

是一个数据框,列q1,q2,q3是具有4个级别1,B,C,D的因子类型。

我想将B,C,D转换为0表示错误的答案,然后我会得到一个只有0 or 1的数字类型数据框。

怎么做?

3 个答案:

答案 0 :(得分:4)

这是一个使这个Vectorized,

的技巧
 (df == 1)*1
 #or (df == 1)+0 , or even abs(df == 1) - as per @d.b's comment

给出,

     q1 q2 q3
[1,]  0  0  0
[2,]  1  0  0
[3,]  0  1  0

要了解其工作原理,df == 1会创建一个逻辑矩阵。通过将矩阵乘以1,我们得到与执行as.integer()TRUE * 1 = 1FALSE * 1 = 0)相同的效果,但这样它将结构保持为矩阵,而as.integer(df == 1)转换到向量([1] 0 1 0 0 0 1 0 0 0)。

答案 1 :(得分:2)

我不是因素专家。但是,如果您将数据框作为字符读入,则如下例所示。

workbench.action.openrecent

您可以考虑以下内容,它将使用二进制结果将数据框转换为数字。

dt <- read.table(text = "q1  q2  q3
C   B   D
                 1   B   C
                 D   1   B ",
                 header = TRUE, stringsAsFactors = FALSE)

更新

来自lmo的解决方案。使用dt[dt != "1"] <- "0" dt <- as.data.frame(sapply(dt, as.numeric)) dt q1 q2 q3 1 0 0 0 2 1 0 0 3 0 1 0 str(dt) 'data.frame': 3 obs. of 3 variables: $ q1: num 0 1 0 $ q2: num 0 0 1 $ q3: num 0 0 0 非常好,as.integer(x == "1")也是循环数据框中所有列的好方法。

dt[] <- lapply(...)

答案 2 :(得分:2)

以下是两种方式:

df <- data.frame(q1 = factor(c("C","1","D"),levels=c("1","B","C","D")),
                 q2 = factor(c("B","B","1"),levels=c("1","B","C","D")),
                 q3 = factor(c("D","C","C"),levels=c("1","B","C","D")))

sapply(df,function(x){levels(x)[levels(x) %in% c("B","C","D")] <- 0;as.numeric(as.character(x))})

sapply(df,function(x){as.numeric(x=="1")})

#      q1 q2 q3
# [1,]  0  0  0
# [2,]  1  0  0
# [3,]  0  1  0