【发布时间】:2020-09-02 09:01:44
【问题描述】:
我想创建因子列的“二进制编码列”。那里有各种代码,它们适用于具有多行的数据帧(即每个级别至少有一行)。我的用例是我可能只在数据框中将因子级别作为“元数据”。
所以给定一个这样的数据框:
haves <- data.frame(x = "a")
haves$x <- factor(as.character(haves$x), ordered = FALSE, levels = c(
"a"
, "b"
, "c"
))
我想获得这个(基于 3 个级别 => 上限(log2(3)) => 2 列):
x bin_x_1 bin_x_2
a 0 0
我在下面进行了尝试,但没有完全奏效。
library(binaryLogic)
encode_binary <- function(x, name = "binary_") {
x2 <- as.binary(unique(unclass(x)) - 1)
maxlen <- ceiling(log2(nlevels(x)))
x2 <- lapply(x2, function(y) {
l <- length(y)
if (l < maxlen) {
y <- c(rep(0, (maxlen - l)), y)
}
y
})
d <- as.data.frame(t(as.data.frame(x2)))
rownames(d) <- NULL
colnames(d) <- paste0(name, 1:maxlen)
d
}
haves <- data.frame(x = "a")
haves$x <- factor(as.character(haves$x), ordered = FALSE, levels = c(
"a"
, "b"
, "c"
))
wants <- cbind(haves, encode_binary(haves[["x"]], name = "bin_x_"))
wants
PS:
ceiling(log2(n)) 确定编码级别需要多少列/位。
【问题讨论】:
-
对于 2 个级别,您需要 1 列,对于 3 + 4、2 列(即位)。这有意义吗?
标签: r