【发布时间】:2011-07-11 09:19:09
【问题描述】:
我想创建一个向量,其中每个元素都是另一个向量的i+6th 元素。
例如,在一个长度为 120 的向量中,我想创建另一个长度为 20 的向量,其中每个元素都是初始向量的值 i, i+6, i+12, i+18...,即我想提取原始向量的每 6 个元素。
【问题讨论】:
我想创建一个向量,其中每个元素都是另一个向量的i+6th 元素。
例如,在一个长度为 120 的向量中,我想创建另一个长度为 20 的向量,其中每个元素都是初始向量的值 i, i+6, i+12, i+18...,即我想提取原始向量的每 6 个元素。
【问题讨论】:
a <- 1:120
b <- a[seq(1, length(a), 6)]
【讨论】:
seq.int 在微基准测试中更快,但我怀疑实际程序中的任何性能提升都会与其他部分的运行时间相形见绌。
a = 1:120; b = [::6]。 Python 做不到前者,R 做不到后者。
获取序列片段的另一个技巧(除了已经提到的 seq 解决方案)是使用短逻辑向量并使用向量循环:
foo[ c( rep(FALSE, 5), TRUE ) ]
【讨论】:
seq,您必须能够在向量上调用length。 letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
我认为你在问两个不一定相同的事情
我想提取每 6 个元素 原来的
你可以通过索引一个序列来做到这一点:
foo <- 1:120
foo[1:20*6]
我想在 其中每个元素是第 i+6 个 另一个向量的元素。
一个简单的方法是用 FALSE 补充一个逻辑因子,直到 i+6:
foo <- 1:120
i <- 1
foo[1:(i+6)==(i+6)]
[1] 7 14 21 28 35 42 49 56 63 70 77 84 91 98 105 112 119
i <- 10
foo[1:(i+6)==(i+6)]
[1] 16 32 48 64 80 96 112
【讨论】:
foo[1:(i+6)!=(i+6)],即输出除第六个以外的所有值。
从向量中的任意起始位置选择每个第n个元素
nth_element <- function(vector, starting_position, n) {
vector[seq(starting_position, length(vector), n)]
}
# E.g.
vec <- 1:12
nth_element(vec, 1, 3)
# [1] 1 4 7 10
nth_element(vec, 2, 3)
# [1] 2 5 8 11
【讨论】:
要选择偏移量/偏移量为 f=0,...,n-1 的每个第 n 个元素,请使用
vec[mod(1:length(vec), n)==f]
当然,您可以将其包装在一个不错的函数中:
nth_element <- function(vec, interval, offset=0){
vec[mod(1:length(vec), interval)==mod(offset, interval)]
}
【讨论】: