提取向量的第n个元素


126

我想创建一个向量,其中每个元素都是i+6th另一个向量的元素。

例如,在长度为120的向量中,我想创建另一个长度为20的向量,其中每个元素都是i, i+6, i+12, i+18...初始向量的值,即我想提取原始元素的第6个元素。

Answers:


160
a <- 1:120
b <- a[seq(1, length(a), 6)]

9
最好至少对长向量使用seq.int(1L,length(a),6L)
Wojciech Sobala 2011年

1
@WojciechSobala您能评论为什么它更好吗?
dpel

1
@DavidPell seq.int在微基准测试中速度更快,但是我怀疑实际程序中任何性能的提高都将与其他部分的运行时间相形见war 。
Sean1708 '16

我讨厌将Python与R进行比较,但是PyRon会有多大?a = 1:120; b = [::6]。Python不能做前者,R不能做后者。
贝尔

44

获取序列片段的另一个技巧(除了已经提到的seq解决方案之外)是使用短逻辑向量并使用向量循环:

foo[ c( rep(FALSE, 5), TRUE ) ]

2
这种方法的优点是可以临时使用。为了使用seq您必须能够调用length引导程序。letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers

27

我想你问的是两个不一定相同的事情

我想提取原始的每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)]即输出除第六个值以外的所有值。
Fredrik Erlandsson

1

从向量中的任何起始位置选择第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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.