如何将字符向量列表转换为单个向量?

时间:2018-09-26 21:48:11

标签: r stringr

感谢您的时间。

我正在执行一些数据处理,并使用了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中的逗号,空格或空格都可以。

我尝试了各种方法,包括unlistflatten。 使用unlist返回此not_desired向量:

 not_desired_vector <- unlist(example_list)

看起来像这样:

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

为了清楚起见,我希望列表以与原始列表相同长度的向量返回,其中具有三个连续元素的列表部分不作为向量的三个元素返回,而是作为一个向量的单个元素中的字符串。

再次感谢您抽出宝贵的时间-向正确方向的任何推动都将受到赞赏。

3 个答案:

答案 0 :(得分:3)

使用tidyverse工具map_chrstr_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]"

reprex package(v0.2.0)于2018-09-26创建。

答案 1 :(得分:1)

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)) }

答案 2 :(得分:0)

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]"