#r #list
#r #Список
Вопрос:
Есть ли способ преобразовать list1
в list2
без циклов в R?
list1 <- list(s1=letters[1:4],
s2=letters[c(1,2,4)],
s3=letters[c(1,2,5)],
s4=letters[1:6])
list2 <- list(a=c('s1', 's2', 's3', 's4'),
b=c('s1', 's2', 's3', 's4'),
c=c('s1', 's4'),
d=c('s1', 's2', 's4'),
e=c('s3', 's4'),
f=c('s4'))
> list1
$s1
[1] "a" "b" "c" "d"
$s2
[1] "a" "b" "d"
$s3
[1] "a" "b" "e"
$s4
[1] "a" "b" "c" "d" "e" "f"
> list2
$a
[1] "s1" "s2" "s3" "s4"
$b
[1] "s1" "s2" "s3" "s4"
$c
[1] "s1" "s4"
$d
[1] "s1" "s2" "s4"
$e
[1] "s3" "s4"
$f
[1] "s4"
Ответ №1:
Вы можете использовать stack
и unstack
, изменив порядок столбцов с помощью [2:1]
:
unstack(stack(list1)[2:1])
#$a
#[1] "s1" "s2" "s3" "s4"
#
#$b
#[1] "s1" "s2" "s3" "s4"
#
#$c
#[1] "s1" "s4"
#
#$d
#[1] "s1" "s2" "s4"
#
#$e
#[1] "s3" "s4"
#
#$f
#[1] "s4"
Ответ №2:
Используя векторы и split()
:
#Code
v1 <- names(sort(unlist(list1)))
v1 <- substring(v1,1,nchar(v1)-1)
v2 <- split(v1,sort(unlist(list1)))
Вывод:
v2
$a
[1] "s1" "s2" "s3" "s4"
$b
[1] "s1" "s2" "s3" "s4"
$c
[1] "s1" "s4"
$d
[1] "s1" "s2" "s4"
$e
[1] "s3" "s4"
$f
[1] "s4"
Ответ №3:
Это можно сделать путем вложения двух операций со списком, т.Е. lapply()
Или purrr::map()
. purrr::map_lgl()
здесь особенно полезно, чтобы упростить код.
library(purrr)
res <-
map(letters[1:6], function(x)
names(list1)[map_lgl(list1, function(y)
any(y %in% x))])
names(res) <- letters[1:6]
res
#> $a
#> [1] "s1" "s2" "s3" "s4"
#>
#> $b
#> [1] "s1" "s2" "s3" "s4"
#>
#> $c
#> [1] "s1" "s4"
#>
#> $d
#> [1] "s1" "s2" "s4"
#>
#> $e
#> [1] "s3" "s4"
#>
#> $f
#> [1] "s4"
Ответ №4:
Опция с enframe
library(tibble)
library(dplyr)
library(tidyr)
enframe(list1) %>%
unnest(c(value)) %>%
select(2:1) %>%
{split(.$name, .$value)}