向量的热编码列表

时间:2019-11-19 08:41:15

标签: r tidyverse

是否有一种快速编码方法,最好使用tidyverse对R中的列表列表(长度不同)进行快速编码?

例如:

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

谢谢!

3 个答案:

答案 0 :(得分:4)

我们可以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

答案 1 :(得分:1)

一个base R选项可能是:

t(table(stack(vals)))

   values
ind 1 2 3
  a 1 0 0
  b 0 1 1
  c 1 1 0

答案 2 :(得分:0)

基本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