簡體   English   中英

R 轉換列表:值到名稱和名稱到值

[英]R convert list: values to names and names to values

有沒有辦法在 R 中將list1轉換為list2而沒有循環?

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"

您可以通過使用[2:1]更改列順序來使用stackunstack

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"

使用向量和split()

#Code
v1 <- names(sort(unlist(list1)))
v1 <- substring(v1,1,nchar(v1)-1)
v2 <- split(v1,sort(unlist(list1)))

Output:

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"

這可以通過嵌套兩個列表操作來完成,即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"

帶有enframe的選項

library(tibble)
library(dplyr)
library(tidyr)
enframe(list1) %>%
     unnest(c(value)) %>%
      select(2:1) %>% 
      {split(.$name, .$value)}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM