2013-05-21 326 views
1

我试图通过在大型数据集中循环变量来构建3D矩阵(请参阅下面的数据'头部')。具体来说,我需要创建一个矩阵,其行数与'LastFixes'的最大数量一样多,有多少列有主题(Sub = 36),有多少页面有条件(即8),我想要从FixStart开始直到FixEnd结束,从FixEnd结束到FixStart开始等等,等等,从一行开始分配1。因此,例如,对于第一行数据,我需要在矩阵的前165行中有1,然后从行#166中的0到330.我的R代码有效,但奇怪的是,我得到的数字不是0, 1矩阵!在下面你可以看到'头部'以及R代码。如果有人能帮我解决这个问题,我将不胜感激。非常感谢用R创建3D矩阵?

enter code here 

head (data) 

    Sub Item Condition FixStart FixEnd 
1 1 4   7  1 165 
2 1 4   7  331 600 
3 1 4   7  623 1180 
4 1 4   7  1202 1487 
5 1 4   7  1511 1561 
6 1 4   7  1696 2466 


lastFix <- max(data$FixEnd) 


datamatrix<-array(0,dim=c(lastFix,36,8)) 

for (i in 1:length(data$Sub)){ 
    n <- data[i,1] 
    if (data[i,3] == "1"){ 
    for (j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,1] <- datamatrix[j,n,1]+1 
    } 
    }else 
    if (data[i,3] == "2"){ 
    for (j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,2] <- datamatrix[j,n,2]+1 
    } 
    }else 
    if (data[i,3] == "3"){ 
    for (j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,3] <- datamatrix[j,n,3]+1 
    } 
    }else 
    if (data[i,3] == "4"){ 
    for (j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,4] <- datamatrix[j,n,4]+1 
    } 
    }else 
    if (data[i,3] == "5"){ 
    for (j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,5] <- datamatrix[j,n,5]+1 
    } 
    }else 
    if (data[i,3] == "6"){ 
    for (j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,6] <- datamatrix[j,n,6]+1 
    } 
    }else 
    if (data[i,3] == "7"){ 
    for (j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,7] <- datamatrix[j,n,7]+1 
    } 
    }else 
    if (data[i,3] == "8"){ 
    for(j in data[i,4]:data[i,5]){ 
     datamatrix[j,n,8] <- datamatrix[j,n,8]+1 
    } 
    } 
} 

回答

0

我相信这就是你要找的。我已经写一个双循环,用于寻址每一个主题X Condtion:

lastFix <- max(data$FixEnd) 

datamatrix <- array(0,dim=c(lastFix,36,8)) 

for(j in seq(dim(datamatrix)[2])){ #loop for Sub 
    for(k in seq(dim(datamatrix)[3])){ #loop for Condition 
     #j=1; k=7 
     data.sub <- subset(data, Sub==j & Condition==k) 
     if(nrow(data.sub) != 0){ 
      for(i in seq(nrow(data.sub))){ 
       ones <- data.sub$FixStart[i]:data.sub$FixEnd[i] 
       datamatrix[ones,j,k] <- 1 
      } 
     } 
     print(paste("Sub", j, ";", "Condition", k, "is finished")) 
    } 
} 

#image shows that 1's have been added to Subject 1 (column) 
image(x=seq(dim(datamatrix)[1]), y=seq(dim(datamatrix)[2]), datamatrix[,,7]) 

你的小数据集随后导致更改该矩阵(子== 1的第七层(条件== 7)和第一柱)。这是一张图片:

enter image description here

+0

非常感谢您的帮助!你的代码是完成同样任务的好方法! – user2403900