耽误您时间,实在对不起。
我正在执行一些数据处理,并使用stringr
包中的str_extract_all
从列中提取一些数据。我的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]"
为了清楚起见,我希望列表作为与原始列表长度相同的向量返回,其中列表中具有三个连续元素的部分不是作为向量的三个元素返回,而是作为向量的单个元素中的一个字符串返回。
再次感谢您的时间-在正确的方向上的任何推动是非常感激的。
发布于 2018-09-27 08:31:13
将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)) }
发布于 2018-09-27 06:10:03
使用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于2018-09-26创建(v0.2.0)。
发布于 2018-09-27 09:40:02
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]"
Method2:
sapply( example_list, paste, collapse=", ")
[1] "[10]" "[44]" "[9], [32], [98]" "NA" "[93]"
https://stackoverflow.com/questions/52526455
复制相似问题