벡터의 모든 n 번째 요소 추출


126

각 요소가 i+6th다른 벡터 의 요소 인 벡터를 만들고 싶습니다 .

예를 들어 길이가 120 인 벡터에서는 각 요소가 i, i+6, i+12, i+18...초기 벡터의 값인 길이가 20 인 다른 벡터를 만들고 싶습니다 . 즉 원본의 6 번째 요소마다 추출하고 싶습니다.

답변:


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

9
긴 벡터에는 seq.int (1L, length (a), 6L)를 사용하는 것이 좋습니다.
Wojciech Sobala

1
@WojciechSobala 왜 더 나은지 언급 해 주시겠습니까?
dpel

1
@DavidPell seq.int은 마이크로 벤치 마크에서 빠르지 만 실제 프로그램의 성능 향상은 다른 부품의 실행 시간으로 인해 줄어 듭니다 .
Sean1708

나는 파이썬과 R을 비교하는 것을 싫어하지만 PyRon은 얼마나 클 수 있습니까? a = 1:120; b = [::6]. 파이썬은 전자를 할 수 없으며 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 '10

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.