3

假设我有以下 rle 对象:

r = rle(c(rep("M",28),rep("N",4265),rep("M",16),rep("S",2),rep("N",400),rep("M",10)));

我想将其分解为以下字符串向量:

a = c("28M","4265N","16M2S","400N","10M");

这意味着我将“N”值和非“N”值及其相应的长度分隔为向量中的单独元素。

请注意,所有非 N 都粘贴在一起,这就是为什么结果有“16M2S”,而不是“16M”“2S”分开的原因。

最有效的方法是什么?

4

2 回答 2

5

这行得通,而且速度应该不错:

l <- r$lengths
v <- r$values
s <- paste0(l, v)
n <- v == "N"
i <- cumsum(c(TRUE, head(n, -1) != tail(n, -1)))

unname(vapply(split(s, i), paste, character(1), collapse = ""))
# [1] "28M"   "4265N" "16M2S" "400N"  "10M"  
于 2013-09-25T00:22:51.493 回答
1

另一种可能:

r2 <- rle(r$values == "N")

len <- r2$lengths

spl <- rep(seq_along(len), len)

len2 <- split(r$lengths, spl)

val <- split(r$values, spl)

mapply(paste0, len2, val, collapse = "", USE.NAMES = FALSE)
# [1] "28M"   "4265N" "16M2S" "400N"  "10M"
于 2013-09-25T01:15:16.980 回答