2017-06-20 10 views
1

96行42372列の行列があります。は、すべての列の4つの4つの値を1つの行に入れて、別の行列にrの行として挿入します。

私はすべての列の最初の4行のモードをとり、別の行列の最初の行としてダンプすることになっています。

次に、すべての列の次の4つの行のモードをとり、別の行列の2番目の行としてダンプします。

など。

新しい行列は24行と42372列を持ちます。

私は以下のような関数を書いています。 SOURCE: Is there a built-in function for finding the mode?

GetMode <- function(x) 

{ 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

出力は、第1の行列です。 (96行42372列)

Output2は新しいマトリックスです。 (24行と列42372)

私は

output2[1,]<-GetMode(output[1:4,]) 

として、今のよう心掛けておりますが、それはすべての列にわたって各行のモードを印刷し、新しい行としてそれを印刷しています。

答えて

0

あなたはdata.tableパッケージを使用することができます

library(data.table) 
#df0 is the original *"data.frame"* 
df1 <- cbind(rep(1:(96/4), each=4), df0) #Add a column for grouping 
colnames(df1)[1] <- "id"     #Make the col name clean 

df1 <- data.table(df1)     #Convert to data table 

df.mode <- df1[,GetMode(.SD),id]   #Get the mode for each group and all columns 

データ:

df0 <- matrix(rep(1:24000, each = 4), nrow = 96, ncol = 100) 
df0 <- data.frame(df0) 

機能:

GetMode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 
+0

Masoudに感謝します。今このアプローチを試してみてください。それは働いている! – Earthshaker

0

この打撃を与えると、それはあなたのために働くなら、私に教え:

# Fake Data 
output <- matrix(round(runif(96*42372, 1, 40)), nrow = 96, ncol = 42372) 

# https://stackoverflow.com/questions/2547402/is-there-a-built-in-function-for-finding-the-mode 
GetMode <- function(x){ 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

every = 4 
output2 <- output; output2[] <- NA 
output2 <- sapply(seq(from = 1, to = nrow(output), by = every), 
         function(i) apply(output[i:(i+(every-1)),], 2, GetMode)) 

dim(output2) 
output2[1:6,1:6] 
+0

こんにちはエヴァンは、どうもありがとうございました。コードは新しい行列が作成された後には動作していますが、これを置き換えています。列と行のその時点で、レコードのいくつかが台無しになり、値がある列から別の列にシフトします。どうもありがとう !! – Earthshaker

+0

サップリ関数の周りにあるt()関数を削除してみてください。明確にするには、24列と42372行が必要ですか? –

+0

こんにちはエバン、はい、私の最終製品は24列と42372行でなければなりません。 – Earthshaker

関連する問題