2015-11-02 63 views
0

我有一個較大的數據集(4352個觀察值),我試圖將其分解爲連續和離散的數據以準備進行貝葉斯分析。到目前爲止,我已經嘗試了兩種不同的方法:使用if-then語句和if else,均在for循環中。`for`循環強制矩陣到R中的大列表中

我有我的觀察作爲對象y比例:

> head(y,10) 
    A B C DEF 
1 0.50 0.5 0.00 0.0 
2 0.95 0.0 0.05 0.0 
3 0.10 0.0 0.00 0.9 
4 0.70 0.0 0.30 0.0 
5 0.95 0.0 0.05 0.0 
6 0.60 0.0 0.40 0.0 
7 0.95 0.00 0.05 0.0 
8 0.95 0.05 0.00 0.0 
9 1.00 0.00 0.00 0.0 
10 1.00 0.00 0.00 0.0 

y長度,我將在以後使用索引的向量的行是否是離散的(0,1)或連續。

y.discrete <- rep(0,dim(y)[1]) 

我的第一種方法是if-then語句:

y.d <- matrix(NA,n,ncat) 

for (i in 1:n){ 
y.d[i,][max(y[i,])==1]=y[i,] 
y.discrete[i][!is.na(y.d[i,])]=1 
} 

for環路產生Error in y.d[i, 1] : incorrect number of dimensions。如果在if-then語句中調用一個單一元素(例如y.d[i,1]),那麼它會正常運行。此外,一旦循環運行,對象y.d從矩陣變爲大列表。我相信這是造成維數錯誤的原因。如果你在i看這裏,這是1

我自己也嘗試了if else

y.d <- matrix(NA,n,4) 

for (i in 1:n){ 
    if (max(y[i,])==1) { 
    y.d[i,]<-y[i,]  
    } else { 
    if (!is.na(y.d[i,1])) { 
     y.discrete[i]<-1 
    } 
    } 
} 

這提供了與環相同的錯誤,但如果你看看i的最後一個值,它是10.這還有改班的問題。

有沒有人對這裏面發生的事情有任何想法?我已經請了兩位同事求助,我們都很難過。我感謝您的幫助。我在Windows 7,64位機器上運行R 3.0.3。

編輯:爲了澄清,我想y.d包含y其中一個值(A,B,C,DEF)恰好等於1的相應行。否則,它應該保持NA。

編輯2: 我一直在嘗試獲取@joran提供的答案的反函數,以用於連續觀察(其值介於 - 但不包含 - 0,1)以及使用索引編制相同的矢量不起作用。當我嘗試:

y.c<-y 
y.c[y.discrete,] <- NA 

我仍然在我的數據與1點的行(見行9 & 10),它不是什麼y.d交付逆:

> head(y.d,10) 
    A B C DEF 
1 NA NA NA NA 
2 NA NA NA NA 
3 NA NA NA NA 
4 NA NA NA NA 
5 NA NA NA NA 
6 NA NA NA NA 
7 NA NA NA NA 
8 NA NA NA NA 
9 1 0 0 0 
10 1 0 0 0 

> head(y.c, 10) 
     A B C DEF 
1 NA NA NA NA 
2 0.95 0.00 0.05 0.0 
3 0.10 0.00 0.00 0.9 
4 0.70 0.00 0.30 0.0 
5 0.95 0.00 0.05 0.0 
6 0.60 0.00 0.40 0.0 
7 0.95 0.00 0.05 0.0 
8 0.95 0.05 0.00 0.0 
9 1.00 0.00 0.00 0.0 
10 1.00 0.00 0.00 0.0 

很抱歉,如果這是一個愚蠢的問題,但是你知道爲什麼我不能只爲我們使用以前的逆向量的向量索引嗎?

+0

這不是從你的問題你的期望輸出應該是什麼明確的。你能描述一下你想要'y.d'包含嗎?推測是「離散」,你只是意味着一行'y'只包含1或0? – joran

+0

R版本3.0.3?當前版本是3.2.2。可能想先更新。 – r3robertson

+0

@ r3robertson我需要的一些軟件包不適用於任何新的軟件。 – Maalthou

回答

0

我有點在這裏猜測,因爲你的問題留下了一些細節。我想你實際上是試圖做的是這樣的:

y.discrete <- apply(y,1,function(x) as.integer(any(x == 1))) 
> y.discrete 
1 2 3 4 5 6 7 8 9 10 
0 0 0 0 0 0 0 0 1 1 

然後:

> y.d <- y 
> y.d[!y.discrete,] <- NA 
> y.d 
    A B C DEF 
1 NA NA NA NA 
2 NA NA NA NA 
3 NA NA NA NA 
4 NA NA NA NA 
5 NA NA NA NA 
6 NA NA NA NA 
7 NA NA NA NA 
8 NA NA NA NA 
9 1 0 0 0 
10 1 0 0 0 
+0

謝謝@joran解決了第一個問題 - 現在有一個相關的問題,我編輯了我的問題來反映。 – Maalthou

+0

@Maalthou嘗試'y.c [as.logical(y.discrete),] < - NA'。第一個版本使用了一個巧妙的快捷方式,如果你在它們上使用布爾運算符(在這種情況下爲'!'),則R將強制0和1的值爲FALSE和TRUE。 – joran