r语言 - 输出具有重复值的向量

  • 本文关键字:向量 r语言 输出 r vector
  • 更新时间 :
  • 英文 :


为了保持脚本记录干净,我想使用 rep(( 输出向量输入,而不是链中的重复值。请参阅下面我使用 dput(( 的示例:

v<-c(rep(1,2), rep(2,4), rep(NA,5))
dput(v)
>c(1, 1, 2, 2, 2, 2, NA, NA, NA, NA, NA)
unknown_function(v)
>c(rep(1,2), rep(2,4), rep(NA,5))

肯定是微不足道的,但我找不到任何简单的解决方案。请问对unknown_function((的建议?

rle将计算值和长度,我们可以将其粘贴在一起:

with(rle(format(v)), paste0("c(", toString(paste0("rep(", values, ",", lengths, ")")), ")"))
## [1] "c(rep( 1,2), rep( 2,4), rep(NA,5))"

您可以使用rle的结构编写一个函数,并将其更改为 crunch 也NA并将其与 @g-grothendieck 的方法组合。

dputRle <- function (x, nmin=3) {
if (!is.vector(x) && !is.list(x)) 
stop("'x' must be a vector of an atomic type")
n <- length(x)
if (n <= 1L) 
return(x)
y <- x[-1L] != x[-n] | is.na(x[-1L]) != is.na(x[-n])
i <- c(which(y), n)
lengths = diff(c(0L, i))
paste0("c(", toString(unlist(sapply(seq(i), function(y) {
if(lengths[y] <= nmin) {rep(x[i[y]], lengths[y])
} else {paste0("rep(", x[i[y]], ",", lengths[y], ")")}
}))), ")")
}
v <- c(rep(1,2), rep(2,4), rep(NA,5), 1)
dputRle(v, 1)
#[1] "c(rep(1,2), rep(2,4), rep(NA,5), 1)"
dputRle(v)
#"c(1, 1, rep(2,4), rep(NA,5), 1)"
v <- 1
dputRle(v)
#[1] 1
v <- numeric(0)
dputRle(v)
#numeric(0)

或者替代。

dputRle2 <- function (x) {
if (!is.vector(x) && !is.list(x)) 
stop("'x' must be a vector of an atomic type")
n <- length(x)
if (n <= 1L) 
return(x)
y <- x[-1L] != x[-n] | is.na(x[-1L]) != is.na(x[-n])
i <- c(which(y), n)
paste0("rep(c(", toString(x[i]), "), c(", toString(diff(c(0L, i))), "))")
}
v <- c(rep(1,2), rep(2,4), rep(NA,5), 1)
dputRle2(v)
#[1] "rep(c(1, 2, NA, 1), c(2, 4, 5, 1))"

有一些方法可以将rlecrep一起使用。以下所有内容将产生相同的向量。

c(1, 2, 2, 3, 3, 3)
c(1, rep(2, 2), rep(3, 3))
c(1, rep(c(2, 3), c(2, 3)))
rep(c(1, 2, 3), c(1, 2, 3))
rep(1:3, 1:3)

最新更新