2016-06-12 3 views
0

xlsxに値-3のセルがいくつか含まれています。いくつかは単一細胞であり、いくつかは-3値を有する連続細胞である。私はRのスクリプトを書こうとしています。このスクリプトは、-3を含むこれらのセルのインデックスを見つけます。その結果、単一のセル-3の値に対して、単一のインデックスを取得し、連続するセル-3の値に対して、開始インデックスと終了インデックスを取得します。R行列の1行にあるすべての連続値と単一値のインデックスを一覧表示する方法

は、ここで私は結果がこのような何か(私が扱われている-3欠損値として)を見てみたい20 columnsと2 rows

3.203 3.204 3.205 -3 3.207 3.207 -3 -3 -3 3.206 3.208 3.207 -3 3.264 3.207 3.208 -3 -3 3.209 -3 
3.205 3.205 3.205 3.21 3.208 3.208 3.209 -3 -3 3.209 3.211 3.21 3.211 3.211 3.21 -3 3.213 3.211 3.212 3.212 

xlsxファイルからmatrixです。したがって、

1 missing value at: (1 , 4) 
3 missing values starting from: (1 , 7) to (1 , 9) 
1 missing value at (1 , 13) 
2 missing values starting from: (1 , 17) to (1 , 18) 
1 missing value at: (1, 20) 
2 missing values starting from: (2 , 8) to (2 , 9) 
1 missing value at: (2, 16) 

ここはRスクリプトですが、間違った結果が出ています。私はインデックスの適切な使用と非常に混同しています。

fileData <- read.xlsx(filePath, 1, header = FALSE, sep = ",") 
dataMatrix <- data.matrix(fileData) 

## Find the number of rows and columns in the matrix 
numberOfRows <- nrow(dataMatrix) 
numberOfColumns <- ncol(dataMatrix) 

## Access each value of the dataMatrix, check if it -3 
    for (i in 1:numberOfRows) # for each row 
    { 
    # Get indexes for -3 value 
    missingValueList = which(dataMatrix[i,] == -3); 
    # Find the index after which there is a break (so no consecutive value) 
    consecutiveBreaks = which(diff(missingValueList) != 1); 
    print(missingValueList) 
    print(consecutiveBreaks) 

    j=0; 

    for(k in 1:length(consecutiveBreaks)) 
    { 
     if(k == 1) 
     { 
     cat(consecutiveBreaks[k], " missing value at: (",i,",",missingValueList[j+k],")","\n"); 
     } 
     else 
     { 
     cat("Value of k: ", k, "\n"); 
     cat(abs(consecutiveBreaks[k]-consecutiveBreaks[k-1]), " missing values starting from: (",i,",",missingValueList[j],")","\n"); 

     } 
     j=j+1; 
    } 
    } 

誰かが希望する解決法を手に入れることができますか?

+0

これは何の動機ですか?インデックスを使って何をしようとしているかによって、より良いアプローチが可能です。 –

+0

@BryanGoggin主な目的は、-3セルをある値で置き換えることです。セル-3インデックス以降の場合、-3を隣接する2つのセル値の平均で置き換えます。 -3の値が複数のセルで連続している場合は、隣接する値の平均値を取って最初の-3セルで置き換え、この新しい値の平均値を隣接値で取って次の-3セルそして賢明なように。 – novicegeek

+1

インデックスを使用してこのコードを複雑にしています。ループを使用して、欠落している値をすべて反復し、同時にそれらを手段で置き換える必要があります。 – JstRoRR

答えて

1

ここに行きます。私はこれがあなたのデータでうまくいくはずだと思います:

val = 1; 
counter = 1; 
temp = matrix(); 

for (i in 1:nrow(mdata)) 
{ 
    for (j in 1:ncol(mdata)) 
    { 
    if (mdata[i,j] == -3) 
    { 

    while (j <= ncol(mdata)) 
    { 
     if (mdata[i,j + val] == -3) 
     { 
     counter = counter + 1; 
     val = val + 1; 
     next;      
     } 
     else 
     { 
     break; 

     } 

    } 

    if (counter == 1) 
    { 
     #print(j); 
     #print(mdata[i, (j - 1):(j + 1)]); 

     temp <- t(as.matrix(mdata[i, (j - 1):(j + 1)])) 
     cat("\n This is with counter 1 \n") 
     print(temp) 
     cat("\n matrix: temp-1", temp[,1],"temp-2", temp[,3],"\n"); 
     to.avg <- c(temp[,1], temp[,3]); 
     avg<-mean(to.avg) 
     mdata[i,j] = avg; 
    } 
    else 
    { 

     temp <- t(as.matrix(mdata[i,(j - 1):(j + counter)])) 
     cat("\n This is with multiple count \n") 
     cat(counter,"consecutive values were found, processing accordingly \n") 
     print(temp); 

     for (k in 0:(counter-1)) 
     { 
     # cat("\n reading temp at the start \n") 
     # print(temp) 
     cat("\n K is ",(k+1), "and array is",length(temp),"long \n") 
     to.avg <- c(temp[,(k+1)], temp[,length(temp)]); 
     cat("averaging", temp[,(k+1)],"and", temp[,length(temp)]); 
     avg<-mean(to.avg) 
     cat("\n average =",avg); 
     temp[,(k+2)] = avg; 
     # cat("\n reading temp as this \n") 
     # print(temp) 
     mdata[i,j+k]=avg 
     } 

    } 

    } 
    else 
    { 
    mdata[i,j] = mdata[i,j]; 
    } 

    val = 1; 
    counter = 1; 

    } 

} 
+0

まさに私がしたいことでした。完全に動作:) – novicegeek

関連する問題