首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将字符向量列表转换为单个向量?

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

Stack Overflow用户
提问于 2018-09-27 05:48:11
回答 3查看 4.6K关注 0票数 4

耽误您时间,实在对不起。

我正在执行一些数据处理,并使用stringr包中的str_extract_all从列中提取一些数据。我的str_extract_all调用使用了一些正则表达式逻辑来提取适当的信息。

但是,str_extract_all返回一个列表。我需要将这个列表转换为一个向量,这样我就可以将这个向量作为一个新列包含到我的数据帧中。

下面是一个可重现的例子。这是我的str_extract_all返回的列表

代码语言:javascript
复制
example_list <- list("[10]",
                     "[44]",
                     c("[9]", "[32]", "[98]"),
                     NA,
                     "[93]")

example_list看起来像这样:

代码语言:javascript
复制
> example_list
[[1]]
[1] "[10]"

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

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

[[4]]
[1] NA

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

我想把这个列表转换成一个相同长度的向量。这是我想要的向量:

代码语言:javascript
复制
desired_vector <- c("[10]",
                  "[44]",
                  c("[9], [32], [98]"),
                  NA,
                  "[93]")

这个向量看起来像这样。

代码语言:javascript
复制
> desired_vector
[1] "[10]"            "[44]"            "[9], [32], [98]" NA                
"[93]" 

或者,当它出现在数据框中而不是打印到控制台时,desired_vector将显示为:

代码语言:javascript
复制
[10]            
[44]            
[9], [32], [98]
NA
[93]

注意:desired_vector中不需要上面的逗号,可以使用空格或不使用空格。

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

代码语言:javascript
复制
 not_desired_vector <- unlist(example_list)

它看起来像这样:

代码语言:javascript
复制
> not_desired_vector
[1] "[10]" "[44]" "[9]"  "[32]" "[98]" NA     "[93]"

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

再次感谢您的时间-在正确的方向上的任何推动是非常感激的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-27 08:31:13

toString应用于每个组件,将其简化为一个向量。这会将NA条目转换为字符串"NA",因此可以对其进行修复。

代码语言:javascript
复制
res <- sapply(example_list, toString)
res[is.na(example_list)] <- NA
res

给予:

代码语言:javascript
复制
[1] "[10]"            "[44]"            "[9], [32], [98]" NA               
[5] "[93]"  

这可以像下面这样用一行来表示:

代码语言:javascript
复制
ifelse(is.na(example_list), NA, sapply(example_list, toString))

或者使用magrittr管道:

代码语言:javascript
复制
library(magrittr)
example_list %>% { ifelse(is.na(.), NA, sapply(., toString)) }
票数 2
EN

Stack Overflow用户

发布于 2018-09-27 06:10:03

使用tidyverse工具map_chrstr_c,我们可以迭代您的列表,将所有长度>1的向量与逗号分隔符连接起来:

代码语言:javascript
复制
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于2018-09-26创建(v0.2.0)。

票数 3
EN

Stack Overflow用户

发布于 2018-09-27 09:40:02

deparse函数有时会为您提供有用的结果。这并不完全像你的愿望,但在未来可能会有用:

代码语言:javascript
复制
sapply(example_list, deparse)
[1] "\"[10]\""       "\"[44]\""        "c(\"[9]\", \"[32]\", \"[98]\")"
[4] "NA"             "\"[93]\""                      

你可以用一些正则表达式来清理它:

代码语言:javascript
复制
gsub("c\\(\\\"|\\\"|\\)", "", sapply(example_list, deparse) )
#[1] "[10]"            "[44]"            "[9], [32], [98]" "NA"              "[93]"           

Method2:

代码语言:javascript
复制
sapply( example_list, paste, collapse=", ")
[1] "[10]"            "[44]"            "[9], [32], [98]" "NA"              "[93]"     
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52526455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档