gpt4 book ai didi

r - 将零长度字符向量作为空字符串处理

转载 作者:行者123 更新时间:2023-12-04 15:38:57 27 4
gpt4 key购买 nike

例如,请参阅下面的 Twitter 句柄提取。目标是拥有一个类似于 tweets 但只有句柄以逗号分隔的字符串。 str_replace_all 会在未找到匹配项时生成空向量,这会进一步引发一些意外错误。

library(purrr)
library(stringr)

tweets <- c(
"",
"This tweet has no handles",
"This is a tweet for @you",
"This is another tweet for @you and @me",
"This, @bla, is another tweet for @me and @you"
)


mention_rx <- "@\\w+"

这是我的第一次尝试:

map_chr(tweets, ~str_c(str_extract_all(.x, mention_rx)[[1]], collapse = ", "))
#> Error: Result 1 must be a single string, not a character vector of length 0

然后我玩弄了一些东西:

mentions <- map(tweets, ~str_c(str_extract_all(.x, mention_rx)[[1]], collapse = ", "))

mentions
#> [[1]]
#> character(0)
#>
#> [[2]]
#> character(0)
#>
#> [[3]]
#> [1] "@you"
#>
#> [[4]]
#> [1] "@you, @me"
#>
#> [[5]]
#> [1] "@bla, @me, @you"

as.character(mentions)
#> [1] "character(0)" "character(0)" "@you" "@you, @me"
#> [5] "@bla, @me, @you"

直到我突然意识到 paste 也可以在这里使用:

map_chr(tweets, ~paste(str_extract_all(.x, mention_rx)[[1]], collapse = ", "))
#> "" "" "@you" "@you, @me" "@bla, @me, @you"

我的问题是:

  • 有没有更优雅的方式到达那里?
  • 为什么 str_c 的行为与使用相同的 collapse 参数的 paste 的行为不同?
  • 为什么 as.charactermap_chr 不能识别字符向量长度为零相当于一个空字符串,但 paste 呢?

我在 str(i)_c 上找到了一些很好的引用资料, paste , 和 difference between them ;但这些都没有解决空字符串的情况。

最佳答案

您不需要map tweetsstr_extract_all 可以处理向量

library(stringr)
str_extract_all(tweets, mention_rx)

#[[1]]
#character(0)

#[[2]]
#character(0)

#[[3]]
#[1] "@you"

#[[4]]
#[1] "@you" "@me"

#[[5]]
#[1] "@bla" "@me" "@you"

现在,如果您需要一个逗号分隔的字符串,那么您可以使用 map

purrr::map_chr(str_extract_all(tweets, mention_rx), toString)
#[1] "" "" "@you" "@you, @me" "@bla, @me, @you"

要回答“为什么”的问题,我们可以查看pastestr_c 函数的文档。

来自 ?paste

Vector arguments are recycled as needed, with zero-length arguments being recycled to "".

来自 ?str_c

Zero length arguments are removed.

因此,默认情况下 str_c 会删除零长度参数,这使得输出成为一个 0 长度字符串,这对 map_chr 无效,但它适用于 map 作为 map 返回一个列表

map(tweets, ~str_c(str_extract_all(.x, mention_rx)[[1]], collapse = ", "))

#[[1]]
#character(0)

#[[2]]
#character(0)

#[[3]]
#[1] "@you"

#[[4]]
#[1] "@you, @me"

#[[5]]
#[1] "@bla, @me, @you"

关于r - 将零长度字符向量作为空字符串处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58703897/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com