2017-10-17 4 views
3

또는 벡터를 연속 멤버 쌍으로 분할하고 목록에서 결합하는 방법은 무엇입니까?각 요소가 주어진 벡터의 연속 구성원 쌍인 목록을 작성하십시오.

Supose 당신은 벡터 내 목표는이 작업은 여러 경로 세그먼트를 대표하도록되어

path <- list(c(1,5), c(5,9), c(9,13), c(13,17)) 

다음 목록을 작성하는 것입니다

1 5 9 13 17 

입니다

map <-seq(from = 1, to = 20, by = 4) 

에게 주어진다 그지도가 우리에게 따라야한다고 sugesting하고있다. 1에서 17까지 이동하려면 먼저 첫 번째 경로 (path[1])를 취한 다음 두 번째 경로 (path[2])를 끝까지 가져와야합니다.

내 첫 번째 시도는 저를 인도 :

path <- split(aux <- data.frame(S = map[-length(map)], E = map[-1]), row(aux)) 

그러나 나는이 auxiliar 데이터 프레임 을 작성하고 초기 벡터합니다 (map)이 큰에있을 때 성능 감소를 피하지 않고 할 수있을 거라고 생각. 또한, 꽤 괜찮은 경고 메시지를 반환하지만, 나는 그것을 피하는 것을 좋아합니다.

가 그럼 난에 유래 여기이 발견 (정확히 같은이 내 문제에 대한 적응 버전) :

간단한 솔루션입니다,하지만 난이 수정 된 버전을 사용할 필요가
mod_map <- c(map, map[c(-1,-length(map))]) 
mod_map <- sort(mod_map) 
split(mod_map, ceiling(seq_along(mod_map)/2)) 

map.

제가 이미 두 가지 해결책을 가지고 있기 때문에 나는 너무 많이 묻고 있습니다. 그러나 제 3의 솔루션을 사용할 수 있습니까? 그렇다면 제 첫 번째 솔루션과 같이 데이터 프레임을 사용하지 않아도되고 제 2의 솔루션과 달리 원본 맵을 사용할 수 있습니까? (- 더 나은 함수 이름을 사용하지 - '지도'가 purrr에서 함수이다)

답변

2

우리는 벡터에 Map을 사용할 수 있습니다 제거 첫번째와 마지막 요소와 elementwise

Map(c, map[-length(map)], map[-1]) 

을 연결 또는 @Sotos가 언급 한 바와 같이, split

split(cbind(map[-length(map)], map[-1]), seq(length(map)-1)) 
+3

빠른 것 아니면 ((cbind (지도 [- 길이 (지도),지도 [-1]), 서열 분할'에 의해'지도'를 방지 할 수있는 사용할 수 있습니다 연장 h (map) -1))' – Sotos