2016-07-19 2 views
3

Ich habe diese Matrix:eine Spalte mit dem Wert des Objekts hinzufügen mit max Frequenz

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 

und eine Untergruppe mit dem Index der Zeile Ich mag meine Funktion anwenden:

subset=c(2,4) 

Ich möchte eine neue Spalte in der Matrix "mat" hinzufügen, die nur für die von mir spezifizierte Teilmenge den Wert des Objekts mit der maximalen Häufigkeit in der Zeile enthält.

In diesem Fall gilt:

  • für Zeilennummer 1, ich möchte eine leere Zelle in der neuen Spalte haben,
  • für Zeilennummer 2, würde ich den Wert gefallen „4“ haben, in der neuen Spalte,
  • für Zeile Nummer 3, hätte ich gerne eine leere Zelle in der neuen Spalte,
  • für Zeile Nummer 4, möchte ich den Wert "1" in der neuen Spalte haben.

EDIT: danke für den Code in der Antwort! jetzt sollte ich die NA mit anderen Werten Werte ersetzen: Ich habe eine andere Matrix:

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 

und die Teilmenge:

subset=c(1,3) 

Ich möchte die NA der Matrix replcace (die restlichen Zeilen aus der ersten Untermenge) mit den Spaltennamen des Wertes der Zeile mit dem Maximalwert.

In diesem Fall habe ich "1" für die erste Zeile und "4" für die dritte Zeile.

Antwort

4

Sie suchen nach dem Modus. Leider bietet R keine eingebaute Modusfunktion. Aber es ist nicht zu schwer, einen eigenen zu schreiben:

## 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

Hier ist eine Funktion, die funktioniert. Es berechnet solche Werte (Modi) für alle Zeilen dann Missings ersetzt, wo gewünscht:

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 
} 

Für das Beispiel diese gibt

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

dies, um Ihre Matrix hinzuzufügen nur verwenden 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 
Verwandte Themen