感谢您的时间。
我正在执行一些数据处理,并使用了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]"
为了清楚起见,我希望列表以与原始列表相同长度的向量返回,其中具有三个连续元素的列表部分不作为向量的三个元素返回,而是作为一个向量的单个元素中的字符串。
再次感谢您抽出宝贵的时间-向正确方向的任何推动都将受到赞赏。
答案 0 :(得分:3)
使用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]"
由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]"