2016-07-19 7 views
3

でオブジェクトの値を持つ列を追加します。は、私は、この行列を持っている最大周波数

mat=matrix(c(1,1,1,2,2,2,3,4, 
      4,4,4,4,4,3,5,6, 
      3,3,5,5,6,8,0,9, 
      1,1,1,1,1,4,5,6),nrow=4,byrow=TRUE) 
print(mat) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 1 1 1 2 2 2 3 4 
[2,] 4 4 4 4 4 3 5 6 
[3,] 3 3 5 5 6 8 0 9 
[4,] 1 1 1 1 1 4 5 6 

と私は私の関数を適用したい行のインデックスを持つサブセット:

subset=c(2,4) 

行列 "mat"に新しい列を追加したいと思います。この列には、指定したサブセットに対してのみ、行の最大頻度を持つオブジェクトの値が含まれています。

この場合

:行番号1

  • 、Iは、行番号2ため
  • 、新しい列に空のセルを持っていると思い、私は値を持っていると思います「4」新しい列に
  • 行番号3の場合は、新しい列に空のセルがあります。
  • 行番号4の場合は、新しい列に値1を設定します。

編集: 答えのコードに感謝します! 今私は交換する必要がありますNAは、他の値を使用して値:私は行列のNAをreplcaceしたい

subset=c(1,3) 

mat2=matrix(c(24,1,3,2, 4,4,4,4, 3,2,2,5, 1,3,5,1),nrow=4,byrow=TRUE)

 [,1] [,2] [,3] [,4] 
[1,] 24 1 3 2 
[2,] 4 4 4 4 
[3,] 3 2 2 5 
[4,] 1 3 5 1 

とサブセット: 私は別の行列を持っています(最初のサブセットからの残りの行)を、最大値を持つ行の値のcolnamesで置き換えます。

この場合、最初の行が「1」、3番目が「4」になります。

答えて

4

あなたはモードを探しています。残念ながら、Rは組み込みモード関数を提供しません。しかし、あなた自身のものを書くことはそれほど難しいことではありません。

## create mode function 
modeValue <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

## add new column with NA 
smat <- cbind(mat, NA) 

## calculate mode for subset 
smat[subset, ncol(smat)] <- apply(smat[subset, , drop=FALSE], 1, modeValue) 
smat 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
# [1,] 1 1 1 2 2 2 3 4 NA 
# [2,] 4 4 4 4 4 3 5 6 4 
# [3,] 3 3 5 5 6 8 0 9 NA 
# [4,] 1 1 1 1 1 4 5 6 1 
0

ここには機能する機能があります。これは、所望missings代入するすべての行のような値(モード)を計算する:これは単なる使用、あなたのマトリックスにこれを追加する

myFunc(mat, c(2,4)) 
[1] NA 4 NA 1 

を返し、例えば

myFunc <- function(x, myRows) { 

    myModes <- apply(mat, 1, FUN=function(i) { 
       temp<- table(i) 
       as.numeric(names(temp)[which.max(temp)]) 
      }) 
    myModes[setdiff(seq.int(nrow(x)), myRows)] <- NA 
    myModes 
} 

cbind

cbind(mat, myFunc(mat, c(2,4))) 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 1 1 1 2 2 2 3 4 NA 
[2,] 4 4 4 4 4 3 5 6 4 
[3,] 3 3 5 5 6 8 0 9 NA 
[4,] 1 1 1 1 1 4 5 6 1 
関連する問題