【问题标题】:One hot encode list of vectors一个热编码向量列表
【发布时间】:2020-03-14 17:17:56
【问题描述】:

有没有一种快速的方法可以在 R 中对向量列表(具有不同长度)进行一次热编码,最好使用 tidyverse?

例如:

vals <- list(a=c(1), b=c(2,3), c=c(1,2))

想要的结果是一个宽数据框:

   1   2   3
a  1   0   0
b  0   1   1
c  1   1   0

谢谢!

【问题讨论】:

  • 这是向量列表而不是列表列表
  • 是的。我修好了。

标签: r tidyverse


【解决方案1】:

我们可以enframe列表并将它们转换为单独的行,创建一个虚拟列并使用pivot_wider将数据转换为宽格式。

library(tidyverse)

enframe(vals) %>%
  unnest(value) %>%
  mutate(temp = 1) %>%
  pivot_wider(names_from = value, values_from = temp, values_fill = list(temp = 0))

#  name    `1`   `2`   `3`
#  <chr> <dbl> <dbl> <dbl>
#1 a         1     0     0
#2 b         0     1     1
#3 c         1     1     0

【讨论】:

    【解决方案2】:

    一个base R 选项可以是:

    t(table(stack(vals)))
    
       values
    ind 1 2 3
      a 1 0 0
      b 0 1 1
      c 1 1 0
    

    【讨论】:

      【解决方案3】:

      基本 R 方法,

      do.call(rbind, lapply(vals, function(i) as.integer(!is.na(match(unique(unlist(vals)), i)))))
      
      #  [,1] [,2] [,3]
      #a    1    0    0
      #b    0    1    1
      #c    1    1    0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-31
        • 2023-03-18
        • 2020-08-12
        • 2019-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多