R 如何将字符向量列表转换为单个向量?
谢谢你抽出时间 我正在执行一些数据处理,并从R 如何将字符向量列表转换为单个向量?,r,stringr,R,Stringr,谢谢你抽出时间 我正在执行一些数据处理,并从stringr包中使用str\u extract\u all从列中提取一些数据。我的str\u extract\u all调用使用了一些正则表达式逻辑来提取适当的信息 但是,str\u extract\u all返回一个列表。我需要将这个列表转换为一个向量,这样我就可以将这个向量作为一个新列包含到我的数据帧中 下面是一个可复制的示例。这是我通过str\u extract\u all返回的列表: example_list <- list("[10]
stringr
包中使用str\u extract\u all
从列中提取一些数据。我的str\u extract\u all
调用使用了一些正则表达式逻辑来提取适当的信息
但是,str\u extract\u all
返回一个列表。我需要将这个列表转换为一个向量,这样我就可以将这个向量作为一个新列包含到我的数据帧中
下面是一个可复制的示例。这是我通过str\u extract\u all
返回的列表:
example_list <- list("[10]",
"[44]",
c("[9]", "[32]", "[98]"),
NA,
"[93]")
我想把这个列表转换成一个相同长度的向量。这是我想要的向量:
desired_vector <- c("[10]",
"[44]",
c("[9], [32], [98]"),
NA,
"[93]")
not_desired_vector <- unlist(example_list)
或者,等效地,当它出现在数据帧中且未打印到控制台时,所需的_向量
将如下所示:
[10]
[44]
[9], [32], [98]
NA
[93]
注意:所需_向量中的上述逗号不需要,空格或无空格都可以
我尝试了各种方法,包括取消列表
和展平
。
使用unlist
返回此不需要的向量:
desired_vector <- c("[10]",
"[44]",
c("[9], [32], [98]"),
NA,
"[93]")
not_desired_vector <- unlist(example_list)
为了清楚起见,我希望列表作为与原始列表长度相同的向量返回,其中包含三个连续元素的列表部分不是作为向量的三个元素返回,而是作为向量的单个元素中的一个字符串返回
再次感谢您的时间-非常感谢向正确的方向推进。使用tidyverse
工具map\u chr
和str\u c
,我们可以迭代您的列表,将所有长度>1的向量与逗号分隔符连接在一起:
示例列表%map\u chr(~str\u c(,collapse=“,”))
#>[1]“[10]”[44]”[9]、[32]、[98]“NA
#> [5] "[93]"
由(v0.2.0)于2018年9月26日创建。将toString
应用于简化为向量的每个组件。这会将NA条目转换为字符串“NA”
,因此请修复它们
res <- sapply(example_list, toString)
res[is.na(example_list)] <- NA
res
这可以用这样一行来表示:
> not_desired_vector
[1] "[10]" "[44]" "[9]" "[32]" "[98]" NA "[93]"
ifelse(is.na(example_list), NA, sapply(example_list, toString))
或使用magrittr管道:
library(magrittr)
example_list %>% { ifelse(is.na(.), NA, sapply(., toString)) }
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]"
也许sapply(示例_list,FUN=function(x)if(all(is.na(x)))na else粘贴(x,collapse=“,”)
就足够了。这是一个问得很好的问题,包含示例数据、所需输出和已尝试的方法!非常感谢您的回复-这对我的需求非常有效toString
正是我想要的。因为输出类型未知,所以最好不要使用sapply?我想toString()告诉我们输出类型,但我还是更喜欢vapply之类的东西(因为我不知道sapply可能会执行哪些其他简化)
sapply( example_list, paste, collapse=", ")
[1] "[10]" "[44]" "[9], [32], [98]" "NA" "[93]"