首页 > 解决方案 > 长度为 N 的向量的 n 连接(n 除 N)而不循环(在 R 中)

问题描述

假设我们有一个V长度为 的一维字符串向量N,其中N是一个给定的自然非零整数。让我们引入一个数n ,使得N%%n==0(n 除以 N)。

我想获得这样的向量U,使得第一个分量是 的第一个n分量V的串联,第二个n分量是 '''V''' 的第二个分量的串联,等等,这使用任何循环, plusn是一个变量(基本上它是在更大代码的另一部分中派生的)。

因此,给定N,说V=as.character(1:N)n用介绍N%%n==0。我想在一行中不使用循环(也可能不使用 if):

U = c()
if (length(V)/n>1) {
  for (t in 1:(length(V)/n)) {
    U = paste(U, V[ ngroup(1:length(V),n,ifelse(t==n,0,t)) ], sep='')
  }
} else { U=paste(V,collapse='') }

函数ngroup简单地由下式给出

ngroup <- function(x,n,r) which(x%%n == r) # r: number in [0, 1, 2, ..., n-1].

例如,如果N=8n=2,我们直接有ngroup(1:length(V),n,1) = c(1,3,5,7)(奇数)和ngroup(1:length(V),n,0) = c(2,4,6,8)(偶数),因此

U = paste(V[c(1,3,5,7)], V[c(2,4,6,8)], sep='')

所以这U就是向量 ["V[1]V[2]" "V[3]V[4]" "V[5]V[6]" "V[7]V[8]"] 符号写成(将 V[1] 与 V[2] 连接,将 V[3] 与 V[4] 连接,等等)。

也许我们可以用“应用”系列函数做点什么,但在这种情况下我并不放心。我非常感谢您的帮助!

标签: rstring-concatenation

解决方案


没有要求的循环(*apply是一个循环):

V <- letters[1:24]
n <- 3

foo <- function(V, n) {
  stopifnot(length(V) %% n == 0)
  M <- matrix(V, nrow = n)
  do.call(paste0, asplit(M, 1))
}

foo(V, n)
#[1] "abc" "def" "ghi" "jkl" "mno" "pqr" "stu" "vwx"

推荐阅读