J'essaie d'obtenir le premier maximum et le deuxième maximum d'une ligne par son nom de variable correspondant. Veuillez m'aider à y parvenir.

Trame de données:

df1 <-  data.frame(AC=c(1.463437e-04,1.023486e-04,1.584040e-05 ),
                   BAT = c(6.555388e-05,5.471379e-01,6.025364e-06),
                   REC = c(6.541157e-05,9.590567e-05,1.581244e-01))

Production attendue:

       AC                       BAT          REC         First_Max  Second_Max    
1   1.463437e-04             6.555388e-05 6.541157e-05      AC        REC
2   1.023486e-04             5.471379e-01 9.590567e-05      BAT       AC
3   1.584040e-05             6.025364e-06 1.581244e-01      REC       AC

r
1
prog 3 nov. 2019 à 19:05

2 réponses

Meilleure réponse

Vous pouvez utiliser la fonction order pour obtenir l'ordre des valeurs et obtenir les noms correspondants à partir des noms de colonne (colnames).

Pour parcourir les lignes, utilisez apply(df1, 1, function).

Je mets tout cela dans une seule ligne:

(df1 <- setNames(cbind(df1, t( # cbind to add the two result columns
  apply(df1, 1, function(x) { # apply to iterate over the rows of the data.frame
    colnames(df1)[order(x, decreasing = T)][1:2] # get the column names into the decreasing order of their values and select only the first two columns
  })
)), c(colnames(df1), "First_Max", "Second_Max"))) # add the correct names for the two extra columns
            AC          BAT          REC First_Max Second_Max
1 0.0001463437 6.555388e-05 6.541157e-05        AC        BAT
2 0.0001023486 5.471379e-01 9.590567e-05       BAT         AC
3 0.0000158404 6.025364e-06 1.581244e-01       REC         AC
2
jkd 3 nov. 2019 à 16:20

Voici une option utilisant max.col pour trouver l'index de colonne de la valeur maximale pour chaque ligne ('j1'), replace la valeur maximale avec -Inf et obtenir à nouveau l'index ('j2' ) pour créer les colonnes

j1 <- max.col(df1, 'first')
j2 <- max.col(replace(df1, cbind(seq_len(nrow(df1)), j1), -Inf), 'first')
transform(df1, First_Max = names(df1)[j1], Second_Max = names(df1)[j2])
#            AC          BAT          REC First_Max Second_Max
#1 0.0001463437 6.555388e-05 6.541157e-05        AC        BAT
#2 0.0001023486 5.471379e-01 9.590567e-05       BAT         AC
#3 0.0000158404 6.025364e-06 1.581244e-01       REC         AC
1
akrun 3 nov. 2019 à 16:41