Как я могу преобразовать список векторов символов в один вектор? - PullRequest
0 голосов
/ 27 сентября 2018

спасибо за ваше время.

Я выполняю некоторую обработку данных и использовал str_extract_all из пакета stringr для извлечения некоторых данных из столбца.Мой str_extract_all вызов использовал некоторую логику регулярных выражений для извлечения соответствующей информации.

Однако str_extract_all возвращает список.Мне нужно, чтобы этот список был преобразован в вектор, чтобы я мог включить этот вектор в свой фрейм данных в качестве нового столбца.

Ниже приведен воспроизводимый пример.Вот мой список, возвращаемый str_extract_all:

example_list <- list("[10]",
                     "[44]",
                     c("[9]", "[32]", "[98]"),
                     NA,
                     "[93]")

example_list выглядит так:

> example_list
[[1]]
[1] "[10]"

[[2]]
[1] "[44]"

[[3]]
[1] "[9]"  "[32]" "[98]"

[[4]]
[1] NA

[[5]]
[1] "[93]"

Я бы хотел, чтобы этот список был преобразован в вектор такой же длины,Это мой желаемый вектор:

desired_vector <- c("[10]",
                  "[44]",
                  c("[9], [32], [98]"),
                  NA,
                  "[93]")

Этот вектор выглядит следующим образом.

> desired_vector
[1] "[10]"            "[44]"            "[9], [32], [98]" NA                
"[93]" 

Или, что эквивалентно, как бы он отображался во фрейме данных и не выводился на консоль,desired_vector будет выглядеть так:

[10]            
[44]            
[9], [32], [98]
NA
[93]

Примечание. Запятые в desired_vector запятые не нужны, пробелы или пробелы не подходят.

Я пробовал различные методыЯ нашел, в том числе unlist и flatten.Использование unlist возвращает этот вектор not_desired:

 not_desired_vector <- unlist(example_list)

Что выглядит следующим образом:

> not_desired_vector
[1] "[10]" "[44]" "[9]"  "[32]" "[98]" NA     "[93]"

Чтобы было ясно, я бы хотел, чтобы список возвращался как вектортой же длины, что и исходный список, где часть списка с тремя последовательными элементами возвращается не как три элемента вектора, а как одна символьная строка внутри одного элемента вектора.

Еще раз спасибоза ваше время - любой толчок в правильном направлении очень ценится.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Применение toString к каждому компоненту, упрощающемуся до вектора.Это преобразует записи NA в символьную строку "NA", поэтому исправьте их.

res <- sapply(example_list, toString)
res[is.na(example_list)] <- NA
res

, давая:

[1] "[10]"            "[44]"            "[9], [32], [98]" NA               
[5] "[93]"  

Это можно выразить в одной строке, например:

ifelse(is.na(example_list), NA, sapply(example_list, toString))

или с использованием труб magrittr:

library(magrittr)
example_list %>% { ifelse(is.na(.), NA, sapply(., toString)) }
0 голосов
/ 27 сентября 2018

Функция deparse иногда дает полезные результаты.Это не совсем то, что вам нужно, но может пригодиться в будущем:

sapply(example_list, deparse)
[1] "\"[10]\""       "\"[44]\""        "c(\"[9]\", \"[32]\", \"[98]\")"
[4] "NA"             "\"[93]\""                      

И вы всегда можете очистить его с помощью небольшого регулярного выражения:

gsub("c\\(\\\"|\\\"|\\)", "", sapply(example_list, deparse) )
#[1] "[10]"            "[44]"            "[9], [32], [98]" "NA"              "[93]"           

Метод 2:

sapply( example_list, paste, collapse=", ")
[1] "[10]"            "[44]"            "[9], [32], [98]" "NA"              "[93]"     
0 голосов
/ 27 сентября 2018

Используя tidyverse инструменты map_chr и str_c, мы можем перебрать ваш список, объединяя все длины> 1 векторов вместе с разделителями запятых:

example_list <- list("[10]",
                     "[44]",
                     c("[9]", "[32]", "[98]"),
                     NA,
                     "[93]")

library(tidyverse)
example_list %>% map_chr(~ str_c(., collapse = ", "))
#> [1] "[10]"          "[44]"          "[9], [32], [98]" NA             
#> [5] "[93]"

Создано в 2018-09-26 представьте пакет (v0.2.0).

...