【问题标题】:create binary encoded columns based on levels of data frame's factors meta data根据数据框的因子元数据的级别创建二进制编码列
【发布时间】: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


【解决方案1】:

你可以使用intToBits:

t(sapply(unclass(haves$x)-1, function(x) as.integer(intToBits(x)))[
  seq_len(ceiling(log2(nlevels(haves$x)))),])
#     [,1] [,2]
#[1,]    0    0

作为一个函数:

encode_binary <- function(x, name = "binary_") {
  x <- t(sapply(unclass(x)-1, function(x) as.integer(intToBits(x)))[
          seq_len(ceiling(log2(nlevels(x)))), , drop = FALSE])
  colnames(x) <- paste0(name, seq_len(ncol(x)))
  as.data.frame(x)
}
encode_binary(haves$x)
#     binary_1 binary_2
#[1,]        0        0

【讨论】:

  • 谢谢。我最近尝试使用 intToBits。是否可以调整代码以适用于多列(我的意思是不必为每一列使用这两行代码 - 即具有一个函数,该函数获取每个生成的二进制列的列名称和可能的起始名称)
  • 我添加了一个函数。
  • 由于某种原因这不起作用。测试用例:df
  • 对不起。我在子集化期间忘记了drop = FALSE。还添加了as.data.frame。希望它现在有效。
猜你喜欢
  • 2022-01-20
  • 2021-06-10
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多