r - 长度为 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=8
和n=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
是一个循环):
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"
推荐阅读
- servicenow - 使用 Azure VM 的 ServiceNow Midserver 故障转移集群
- laravel - ftp_mkdir():OOPS:malloc
- git - Rust cargo 在 docker 中获取私有 github 存储库
- sql - 当我们需要在 SQL 中使用无法通过基于集合的方法解决的游标时的示例
- dom - 使用 DOMSubtreeModified 事件检测 dom 更改
- javascript - 计算输入之间的百分比,然后使用 Jquery 根据结果百分比更改背景颜色
- azure - 如何在 APIM 策略中定义数组变量
- google-bigquery - bigquery 中的 REGEXP_CONTAINS 顺序和 Case 语句
- redis - Redis 与 etcdv3 的性能差异
- php - 为什么 response()->download($url); 给出的文件不存在?