2017-01-26 1 views
1

테스트 데이터가있는 큰 코드를 작성하는 중입니다.데이터 프레임을 결합하여 값 바꾸기

> abc 
    BLOCK start end 
1 B1  1 3 
2 B2  4 6 
3 B3  7 9 
4 B4 10 12 
> def 
    V1 V2 V3 V4 
r1 B1 B2 B3 B4 
r2 B1 B2 B4 B3 
r3 B1 B3 B4 B2 
r4 B2 B3 B4 B1 
> 

첫 번째 dataframe, abc는, 블록 범주 변수의 값을 포함합니다 :이 순간에 나는이 두 dataframes 있습니다. 예를 들어, B1은 1에서 시작하여 3 (즉, 1 : 3 또는 1, 2, 3)으로 끝납니다.

내 목표는 abc 데이터 프레임을 모든 값 범위로 확장 한 다음 def 데이터 프레임과 결합하는 것입니다. 내가 조인, 병합 및 다른 형식으로 많은 시도를 만들었지 만 성공을 관리하지는 않습니다. 어떤 도움이라도 대단히 감사 할 것입니다. 부분에서

1 2 3 4 5 6 7 8 9 10 11 12 
1 2 3 4 5 6 10 11 12 7 8 9 
1 2 3 7 8 9 10 11 12 4 5 6 
4 5 6 7 8 9 10 11 12 1 2 3 
+0

이 너무 느, 한 번에 출력을 행을 구성, 행과 def''의 열을 통해 두 개의 루프로, 순진 방법이 있나요? – Spacedman

답변

2

작성을 다음과 같이

원하는 출력된다. 행 번호, 블록 정의 주어진 출력의 N 번째 행을 생성하는 기능이어서

> seqB 
function(B,abc){b = abc[abc$BLOCK==as.character(B),];seq(b$start, b$end)} 
> seqB("B2",abc) 
[1] 4 5 6 

, 출력 행 블록 순서 : 첫번째 기능은 블록 코드 및 블록 정의 주어진 시퀀스를 생성

def를 작성하여 나는 당신이 할 수있는 생각

> do.call(rbind,lapply(1:nrow(def),rowN,def=def,abc=abc)) 
    V11 V12 V13 V21 V22 V23 V31 V32 V33 V41 V42 V43 
[1,] 1 2 3 4 5 6 7 8 9 10 11 12 
[2,] 1 2 3 4 5 6 10 11 12 7 8 9 
[3,] 1 2 3 7 8 9 10 11 12 4 5 6 
[4,] 4 5 6 7 8 9 10 11 12 1 2 3 

:

> rowN 
function(N,def,abc){do.call(c,lapply(def[N,],seqB,abc=abc))} 

> rowN(3,def,abc) 
V11 V12 V13 V21 V22 V23 V31 V32 V33 V41 V42 V43 
    1 2 3 7 8 9 10 11 12 4 5 6 

마지막으로, 출력을 최대 Nrow 시간이 모든 것을 rbind 것을 적용 확장 된 시퀀스를 사용하여 abc의 넓은 버전에 합류 한 다음 모든 숫자를 추출하고 올바른 행 및 열 수의 행렬에서 다시 배열하는 것이 더 빠를 것이라고 확신하지 못합니다.

0

@ 스페이스 맨이 제안한 것과 다른 접근법.

은 첫째로, I가 행함으로써 벡터로 DEF 행렬 축소 그들의 수치로 블록을 대체하여 매트릭스를 다시 구성 다음에, 블록을 정의

crt_Block <- paste0(abc$BLOCK,"<- seq(",abc$start,",",abc$end,")") 
for(i in 1:length(crt_Block)) eval(parse(text = crt_Block[i])) 

가 있습니다.

v <- as.vector(t(def)) 
vec <- eval(parse(text = paste0("c(", paste(v,collapse=","),")"))) 
matrix(vec,byrow = T, ncol=3*ncol(def)) 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] 
[1,] 1 2 3 4 5 6 7 8 9 10 11 12 
[2,] 1 2 3 4 5 6 10 11 12  7  8  9 
[3,] 1 2 3 7 8 9 10 11 12  4  5  6 
[4,] 4 5 6 7 8 9 10 11 12  1  2  3 
관련 문제