2011-08-04 8 views
0

저는 R에서 일하고 있습니다. 데이터 프레임 df가 있습니다.시리즈를 병렬 세트로 다시 번호 매기기 방법

> str(exp) 
'data.frame': 691200 obs. of 19 variables: 
$ groupname: Factor w/ 8 levels "rowA","rowB",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ location : Factor w/ 96 levels "c1","c10","c11",..: 1 2 3 4 12 23 34 45 56 67 ... 
$ starttime: num 0 0 0 0 0 0 0 0 0 0 ... 
$ inadist : num 0 0.2 0 0.2 0.6 0 0 0 0 0 ... 
$ smldist : num 0 2.1 0 1.8 1.2 0 0 0 0 3.3 ... 
$ lardist : num 0 0 0 0 0 0 0 0 0 1.3 ... 
$ fPhase : Factor w/ 2 levels "Light","Dark": 2 2 2 2 2 2 2 2 2 2 ... 
$ fCycle : Factor w/ 6 levels "predark","Cycle 1",..: 1 1 1 1 1 1 1 1 1 1 ... 

다른 timepoint 열을 추가하고 싶습니다. starttimefCycle의 시작 부분을 기준으로합니다. 그래서 starttime=1801fCycle='Cycle 1'의 경우 timepoint=1이됩니다.

df$timepoint를 만드는 가장 좋은 방법은 무엇입니까?

장난감 데이터 세트 :

starttime fCycle timepoint 
1   1  1 
2   1  2 
3   1  3 
4   1  4 
5   2  1 
6   2  2 
7   2  3 
8   2  4 
9   3  1 
10  3  2 
11  3  3 
12  4  1 
13  4  2 
14  4  3 
15  5  1 
16  5  2 
17  6  1 
18  6  2 
19  6  3 
20  6  4 
+0

# treat same starttimes in an fcycle identically ddply(mydf, .(fCycle), transform, timepoint = rank(starttime, ties = 'min')) # treat same starttimes in an fcycle using average ddply(mydf, .(fCycle), transform, timepoint = rank(starttime, ties = 'average')) 
[이 질문에서] (http://www.stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)에서 설명한대로 장난감 데이터 세트를 사용하십시오. 지금은 어떤 시작 시간인지 전혀 알지 못한다. 생각할 수있는 유일한 것은'df $ timepoint <- 1'이다. (시작 시간은주기 내의 모든 관찰에 대해 같다고 가정한다.) –

+0

@Joris Meys : 예제 데이터를 추가했습니다. 아이디어는 어떤주기의 시작부터 같은 오프셋에서 측정 값을 비교할 수 있어야한다는 것입니다. – dnagirl

+0

명확히하기 위해 fCycle [c (21,22)] = c (1,1) 일 경우 어떻게됩니까? 시간 지점이 지금입니까 (1,2)? 아니면 사이클이 단조롭게 증가합니까? – Iterator

답변

4

rlesequence을 결합 할 수 있습니다. 다음은 몇 가지 샘플 코드입니다. 당신이 찾고 있던 결과물입니까?

require(plyr) 

mydf = data.frame(
    starttime = 1:20, 
    fCycle = c(rep(1:3, each = 4), rep(4:5, each = 3), rep(6, 2)) 
) 

# sort data in increasing order of cycle and starttime 
mydf = arrange(mydf, fCycle, starttime) 

mydf = transform(mydf, timepoint = sequence(rle(fCycle)$lengths)) 

참고 : 같은 fCycle 내에서 동일 starttimes가있을 수 있다는 사실에 비추어, 여기 rankddply를 사용하여 다른 방법입니다

당신은 당신이 원하는 것을 명확히 할 수 있습니다
+0

+1 '시퀀스'를 잘 ​​사용합니다. 그냥 메모 :','는'starttime' 선언의 마지막에 빠진 것 같습니다. – Iterator

+0

+1 두 번째 .... – Andrie

+0

@Iterator. 감사. 나는',' – Ramnath

2

이, 솔루션의 개요입니다. rle() 함수를 통해 시작할 수있는 RLE (run length encoding)에서 파생 된 것을 요구하는 것처럼 보입니다.

  1. rle() 출력은 각 실행의 길이를 제공합니다 (lengths 지정).
  2. 각 실행이 발생하는 오프셋은 (cumsum(c(1,lengths))을 통해) 계산할 수 있습니다.
  3. 다음은 충분한 횟수만큼 (즉, 실행중인 각 항목에 대해) rep (반복) 될 수 있습니다.
  4. 각 위치 (1:n)에 대해 간단히 실행 시작 위치를 빼십시오.

편집 : 3 단계에서 rep을 사용할 필요가 없습니다. 길이를 조회 할 수 있습니다.

관련 문제