2017-02-28 42 views
-1

生存時間是在大小爲1 x n的有序向量x中給出的數值時間測量。對於x中的兩個時間點,聯繫被定義爲x[i] == x[j],其中如果所有中間時間都是關係,則排序強制ij相鄰,i+1 == jk指數分開。用於統計生存時間中的關係的高效計數器(R)

鑑於x我需要一個有效的計數器,返回(1)唯一時間向量(無雙),(2)每次關係計數。

下面是我的判斷代碼。有沒有更有效的方法來做到這一點?

我們有一些時間對指數5,6和9和10

x = 1:10 
x[5] = 6 
x[10] = 9 

領帶indentifier關係:

x_new <- ties <- numeric() 
n <- length(x) 
i = 1; k=1 

while(i <= n){ 
    d = NA 
    if(i+1<=n) {d = x[i] - x[i+1]} 
    j = 0 

    while(d==0 & (i+j+1)<=n){ 
    j = j + 1 
    d = x[i] - x[i+j+1] 
    } 

    x_new[k] = x[i] 
    ties[k] = j + 1 
    i = i + j + 1 
    k = k + 1 
} 

給予期望的結果:

cbind(x_new,ties) 
    x_new ties 
[1,]  1 1 
[2,]  2 1 
[3,]  3 1 
[4,]  4 1 
[5,]  6 2 
[6,]  7 1 
[7,]  8 1 
[8,]  9 2 
+1

你想要'rle(x)'? –

+1

根據您的向量關係的定義可以只在一行中。所以,我認爲'table(x)'或'data.frame(table(x))'也可以。 – AntoniosK

+0

@AntoniosK true我現在意識到我需要顯式代碼,因爲需要在第一個'while'循環中執行另一個動作。見下面的評論。也許我會提出這個問題 – tomka

回答

1

只需使用rle

sapply(rle(sort(x)), cbind) 
#  lengths values 
#[1,]  1  1 
#[2,]  1  2 
#[3,]  1  3 
#[4,]  1  4 
#[5,]  2  6 
#[6,]  1  7 
#[7,]  1  8 
#[8,]  2  9 
+0

謝謝。我需要明確的代碼,因爲對於每個「i」,需要對另一個相同長度的「x」變量執行額外的操作,這在代碼中省略了。但是你的回答對於我提出的問題來說是詳盡無遺的。也許我會讚揚我的問題。 – tomka