【问题标题】:n-Concatenation of a vector of length N (n divides N) without looping (in R)长度为 N 的向量的 n 级联(n 除 N)而不循环(在 R 中)
【发布时间】:2020-09-22 07:35:58
【问题描述】:

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

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

因此,给定N,比如说V=as.character(1:N)。用N%%n==0 介绍n。 我想做无循环(也可能没有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] 连接等)。

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

【问题讨论】:

  • 您可以在matrix(V, n) 上使用apply()。类似apply(matrix(V, n), 1, paste0, collapse='')
  • 嗨,apply(t(matrix(V, n)), 1, paste0, collapse='') 确实有效。谢谢!
  • 试试,apply(matrix(V, n), 2, paste0, collapse='')

标签: r string-concatenation


【解决方案1】:

没有按要求循环(*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"

【讨论】:

  • 这个确实大大减少了时间。感人的。谢谢!
  • 在您的解决方案中do.call(...) 隐藏了循环。
  • @jogo 这不正确。没有循环。 do.call(paste0, asplit(M, 1))paste0(asplit(M, 1))[[1]], asplit(M, 1))[[2]], asplit(M, 1))[[3]]) 相同(但显然只有一次调用 asplit)。
  • @Roland 所以在功能上你必须和*apply()做的一样。
  • @jogo 我不明白你的最后评论。我只能重申:我的答案中显示的方法不涉及 R 级别循环。
【解决方案2】:

也许你可以试试

sapply(split(V, ceiling(seq_along(V)/n)),paste0, collapse = "")

do.call(paste0,as.data.frame(do.call(rbind,split(V, ceiling(seq_along(V)/n)))))

示例

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

这样

> sapply(split(V, ceiling(seq_along(V)/n)),paste0, collapse = "")
    1     2     3     4     5     6     7     8
"abc" "def" "ghi" "jkl" "mno" "pqr" "stu" "vwx"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 2017-03-24
    • 1970-01-01
    • 2014-12-17
    • 2022-01-01
    • 1970-01-01
    • 2012-12-29
    • 2014-12-27
    相关资源
    最近更新 更多