如何解决长度为Nn除以N的向量的n级串联而没有循环在R中
假设我们有一个长度为V
的一维字符串向量N
,其中N
是给定的自然非零整数。让我们引入一个数字n
,使得N%%n==0
(n除以N)。
我想获得向量U
,使得第一个分量是n
的前V
个分量的串联,第二个分量是第二个{{ 1}}组成部分,例如''V''等,并且此不使用任何循环,加上n
是一个变量(基本上是从较大的另一部分派生的代码)。
因此,给定n
,说N
。将V=as.character(1:N)
与n
一起引入。
我想无循环(也可能没有 if )和一行:
N%%n==0
其中函数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,t)) ],sep='')
}
} else { U=paste(V,collapse='') }
简单地由
ngroup
例如,如果ngroup <- function(x,r) which(x%%n == r) # r: number in [0,1,2,...,n-1].
和N=8
,我们直接拥有n=2
(奇数)和ngroup(1:length(V),1) = c(1,3,5,7)
(偶数),因此
ngroup(1:length(V),0) = c(2,4,6,8)
,使得U = paste(V[c(1,7)],V[c(2,8)],sep='')
是向量[“ 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”功能系列做些事情,但是在这种情况下我并不感到轻松。非常感谢您的帮助!
解决方法
没有请求的循环(*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"
,
也许您可以尝试
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,collapse = "")
1 2 3 4 5 6 7 8
"abc" "def" "ghi" "jkl" "mno" "pqr" "stu" "vwx"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。