按字符位置对字符串进行子集处理在R中的实现

3

我找不到一个优雅的解决方案来解决R中一个相对简单的问题。我想根据位置向量从字符串中提取字符。例如,如何从example.string中提取第1、3和5个字符?substr没有起始和结束位置会无法工作。

example.string <- "ApplesAndCookies"
characters.wanted <- c(1,3,5)

期望的输出将是: Ape

我可以设计一个循环或函数来完成这个任务,但一定有更简单的方法...

4个回答

4

对于一个字符串和一个向量,您可以

rawToChar(charToRaw(example.string)[characters.wanted])

输出

[1] "Ape"

对于一个字符向量,您可以

sapply(your_vector, function(x, i) rawToChar(charToRaw(x)[i]), characters.wanted)

3
一个单字符串的可能解决方案。
example.string <- "ApplesAndCookies"
characters.wanted <- c(1,3,5)

paste(unlist(strsplit(example.string, ''))[characters.wanted], collapse = '')
# ---------------------------------------------------------------------------
[1] "Ape"

扩展字符串向量。

example.string <- c("ApplesAndCookies","ApplesAndCookies","ApplesAndCookies")
characters.wanted <- c(1,3,5)

sapply(strsplit(example.string, ''), function(x) {
  paste(x[characters.wanted], collapse = '')
})
# ---------------------------------------------------------------------------
[1] "Ape" "Ape" "Ape"

1
这很有效,我认为这是最简单的。谢谢!如果我想将其应用于字符串向量,我想我会使用sapply,对吗?例如:sapply(vector.of.strings, function(x) paste(unlist(strsplit(x,""))[chars.to.keep], collapse = ""))。那是最好的方式吗? - Alex Krohn
1
我已经编辑了答案,以包括这个选项。如果您使用sapply,则无需额外调用unlist() - Dion Groothof

2
在“Biostrings”包中有一个函数可以实现此功能。首先,您需要安装BiocManager。请参考此链接进行安装。
if (!require("BiocManager", quietly = TRUE))
     install.packages("BiocManager")
BiocManager::install(version = "3.14")

接下来安装并加载"Biostrings"软件包

BiocManager::install("Biostrings")
library(Biostrings)

您可以使用函数letter()来对字符串进行子集提取。例如:
x <- "abcde"
letter(x, 1:2)

"ab"

1

您可以使用以下方法:

example.string <- "ApplesAndCookies"
characters.wanted <- c(1,3,5)

paste(strsplit(example.string, "")[[1]][characters.wanted], collapse="")

输出:

[1] "Ape"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接