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
的数字类型数据框。
怎么做?
答案 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 = 1
和FALSE * 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