Bir vektörün her n'inci elemanını çıkarın


127

Her bir öğenin i+6thbaşka bir vektörün öğesi olduğu bir vektör oluşturmak istiyorum .

Örneğin, 120 uzunluğundaki bir vektörde, her bir öğenin i, i+6, i+12, i+18...başlangıç ​​vektörünün değeri olduğu 20 uzunluğunda başka bir vektör oluşturmak istiyorum , yani, orijinalin her 6. elemanını çıkarmak istiyorum.

Yanıtlar:


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

9
En azından uzun vektörler için seq.int (1L, uzunluk (a), 6L) kullanmak daha iyidir
Wojciech Sobala

1
@WojciechSobala Neden daha iyi olduğunu yorumlayabilir misiniz?
dpel

1
@DavidPell seq.int, microbenchmarklarda daha hızlıdır, ancak gerçek bir programdaki herhangi bir performans artışının diğer parçaların çalışma süresiyle cüce kalacağından şüpheleniyorum.
Sean1708

Python'u R ile karşılaştırmaktan nefret ediyorum, ancak PyRon ne kadar harika olabilir? a = 1:120; b = [::6]. Python ilkini yapamaz, R ikincisini yapamaz.
BERS

44

Sıralı parçaları elde etmenin başka bir hilesi (daha önce bahsedilen sekans çözümünün ötesinde) kısa bir mantıksal vektör kullanmak ve vektör geri dönüşümünü kullanmaktır:

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

2
Bu yaklaşımın bir avantajı, geçici olarak kullanılabilmesidir; kullanmak için vektör üzerinden seqarama yapabilmeniz gerekir length. letters[letters < 'm'][c(TRUE, FALSE, FALSE)]
Matt Chambers

27

Sanırım aynı olması gerekmeyen iki şey soruyorsunuz

Orijinalin her 6 elementini çıkarmak istiyorum

Bunu bir diziyi indeksleyerek yapabilirsiniz:

foo <- 1:120
foo[1:20*6]

Her bir elemanın başka bir vektörün i + 6. elemanı olduğu bir vektör oluşturmak istiyorum.

Bunu yapmanın kolay bir yolu, mantıksal bir faktörü FALSE'larla desteklemektir 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

Çok şık! Bunu diğer yönde de kullandım, foo[1:(i+6)!=(i+6)]yani altıncı hariç tüm değerleri çıkardım .
Fredrik Erlandsson

1

Vektördeki herhangi bir başlangıç ​​konumundan her n'inci öğeyi seçmek için

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.