Преобразовать список переменной длины в матрицу в R - PullRequest
0 голосов
/ 16 ноября 2018

Если бы у меня был список векторов переменной длины:

[[1]]
[1] 1 2 3 4

[[2]]
[1] 4 5 6

[[3]]
[1] 1 2 3 4 5 6 7 8 9

[[4]]
[1] 'a' 'b' 'c'

Как я могу преобразовать это в фрейм данных / логическую матрицу с элементами списка, представленными в виде столбцов?

то есть, например, фрейм данных:

    1 2 3 4 5 6 7 8 9 'a' 'b' 'c'
[1] 1 1 1 1 0 0 0 0 0  0   0   0
[2] 0 0 0 1 1 1 0 0 0  0   0   0
[3] 1 1 1 1 1 1 1 1 1  0   0   0
[4] 0 0 0 0 0 0 0 0 0  1   1   1

некоторые данные:

x <- list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9), c("a", "b", "c"))

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вот базовая опция R:

# extract unique values from x
uv <- unique(unlist(x)) 
# Check in each element of lists which values are present and bind everything toegether
out <- do.call(rbind, lapply(x, function(e) as.integer(uv %in% e) ))
# Convert from matrix to data.frame and add column names
out <- setNames(as.data.frame(out), uv)
out

  1 2 3 4 5 6 7 8 9 a b c
1 1 1 1 1 0 0 0 0 0 0 0 0
2 0 0 0 1 1 1 0 0 0 0 0 0
3 1 1 1 1 1 1 1 1 1 0 0 0
4 0 0 0 0 0 0 0 0 0 1 1 1
0 голосов
/ 16 ноября 2018

Вот вариант base R с stack и table

table(stack(setNames(x, seq_along(x)))[2:1])
#   values
#ind 1 2 3 4 5 6 7 8 9 a b c
#  1 1 1 1 1 0 0 0 0 0 0 0 0
#  2 0 0 0 1 1 1 0 0 0 0 0 0
#  3 1 1 1 1 1 1 1 1 1 0 0 0
#  4 0 0 0 0 0 0 0 0 0 1 1 1
0 голосов
/ 16 ноября 2018

Как-то так?

library(tidyverse)
x = list(c(1, 2, 3, 4), c(4, 5, 6), c(1, 2, 3, 4, 5, 6, 7, 8, 9))
y = tibble(column1= map_chr(x, str_flatten, " "))

Где у это:

# A tibble: 3 x 1
  column1          
  <chr>            
1 1 2 3 4          
2 4 5 6            
3 1 2 3 4 5 6 7 8 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...