Сопоставить вектор со списком значений ключей, используя purrr: map - PullRequest
2 голосов
/ 17 октября 2019

Я хочу сопоставить вектор со списком значений ключей. Я хотел бы получить список, используя purrr: map (или другой метод tidyverse), где ключами будут символы перед первой запятой, а значения (векторы) - остальными символами. Мое решение, использующее цикл for:

v <- c("a,1,2", "b,4,5,6", "c,x")
l <- list()

for(vv in v) {
  vv_split <- vv %>% stringr::str_split(",")
  l[[vv_split[[1]][1]]] <- vv_split[[1]][-1]
}

Ответы [ 2 ]

1 голос
/ 17 октября 2019

Я думаю, что более простое решение -

library(tidyverse)
v <- c("a,1,2", "b,4,5,6", "c,x")

# Split each string into its character elements
l <- str_split(v, ",") %>% 
    #Extract the first element to use as the list element name
    set_names(., map(., 1)) %>% 
    #Remove the first element
    map(tail, -1)
l
#> $a
#> [1] "1" "2"
#> 
#> $b
#> [1] "4" "5" "6"
#> 
#> $c
#> [1] "x"

Хотя шаг set_names может улучшить читаемость

1 голос
/ 17 октября 2019

Вот один вариант с read.csv и split

df1 <- read.csv(text = v, header = FALSE, stringsAsFactors = FALSE)
lapply(split(df1[-1], df1[,1]), function(x) na.omit(unlist(x, use.names = FALSE)))

Или другой вариант с tidyverse

library(dplyr)
library(tibble)
library(tidyr)
enframe(v) %>%
     separate_rows(value) %>% 
     group_by(name) %>% 
     mutate(name1 = value[1]) %>%
     slice(-1) %>%
     ungroup %>% 
     select(-name) %>% 
     unstack(value ~ name1)
#$a
#[1] "1" "2"

#$b
#[1] "4" "5" "6"

#$c
#[1] "x"

Или с str_remove и str_replace

str_remove(v, '.,') %>% 
      strsplit(',') %>% 
      set_names(str_extract(v, '.'))
#$a
#[1] "1" "2"

#$b
#[1] "4" "5" "6"

#$c
#[1] "x"
...