簡體   English   中英

將for循環強制矩陣轉換為R中的大列表

[英]`for` loop coercing matrix into large list in R

我有一個較大的數據集(4352個觀測值),我試圖將其分解為連續的和離散的數據,以准備進行貝葉斯分析。 到目前為止,我已經試過這樣做的兩種不同的方法:使用if-then語句和if else ,都內for循環。

我將觀察結果作為對象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 yd[i, 1] : incorrect number of dimensions產生Error in yd[i, 1] : incorrect number of dimensions 如果您在if-then語句中調出一個元素(例如yd[i,1] ),則它可以正常運行。 同樣,一旦循環開始運行,對象yd將從矩陣更改為大列表。 我相信這是導致尺寸數量錯誤的原因。 如果你在這里看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。

編輯:為明確起見,我希望yd包含y中對應的行,其中值(A,B,C,DEF)之一恰好等於1。否則,應保持NA。

編輯2:我一直在嘗試獲取@joran提供的答案的反函數,以用於連續觀測(值介於-之間但不包含-0,1),並且使用相同向量進行索引是'工作。 當我嘗試:

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

我的數據中仍然有帶有1的行(請參閱第9和10行),這與yd傳遞的結果相反:

> 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

抱歉,如果這是一個愚蠢的問題,但是您知道為什么我不能僅僅索引我們以前使用過的逆向量嗎?

我在這里有點猜測,因為您的問題遺漏了一些細節。 我認為您實際要執行的操作是這樣的:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM