从字符串中选择每第n个字符

我有一串带有随机空格和一些句点的随机字母。我想从中取出每第 n 个值(例如每 10 个)。我的想法是,如果我可以转置它,那么我可以使用行号来选择每个第 n 个值。任何帮助表示赞赏!

string <- "hutmnycdsldzlkt.ytairuaypk  dq.gubgp hyfjuwvpcdmvqxfcuhapnx"

回答

跟进 OP 的想法(“使用行号”)。拆分字符串,用 10 行填充矩阵,选择第一行。

matrix(strsplit(x, "")[[1]], nrow = 10)[1, ]
# [1] "h" "d" "r" "." "j" "x"

您将收到回收警告,但这不会影响我们,因为我们选择了第一行。


好东西charToRaw

rawToChar(charToRaw(x)[c(TRUE, rep(FALSE, 9))])
# [1] "hdr.jx"


回答

我们可以拆分字符串并用于seq获取元素

v1 <- strsplit(string, "")[[1]]
v1[seq(1, by = 10, length(v1))]
#[1] "h" "d" "r" "." "j" "x"

或者使用正则表达式查看

library(stringr)
str_replace_all(string, "(.).{1,9}", "1")
#[1] "hdr.jx"

或者让它动态 glue

n <- 9
str_replace_all(string, glue::glue("(.).{1,[n]}",
          .open = '[', .close = ']'), "1")
#[1] "hdr.jx"


回答

substring将采用first=and的向量last=,因此我们可以形成一个适当的序列并从那里开始。

func <- function(x, n, start = 1) {
  vapply(x, function(z) {
    i <- seq.int(start, nchar(z), by = n)
    i <- i[i > 0]
    paste(substring(x, i, i), collapse = "")
  }, character(1))
}

func(string, 10)
# hutmnycdsldzlkt.ytairuaypk  dq.gubgp hyfjuwvpcdmvqxfcuhapnx 
#                                                    "hdr.jx" 

其中每 10 个(从 1 开始)是

hutmnycdsldzlkt.ytairuaypk  dq.gubgp hyfjuwvpcdmvqxfcuhapnx 
12345678901234567890123456789012345678901234567890123456789
^         ^         ^         ^         ^         ^
h         d         r         .         j         x

(我使用apply变体的最大原因是,如果你有一个字符串向量,哪里substring可以优雅地工作。)


以上是从字符串中选择每第n个字符的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>