0
votes

Trouvez d'abord, deuxième et troisième maximum de chaque ligne et leurs noms de colonne correspondants dans un cadre de données dans R

J'essaie de trouver le premier max, le deuxième max et la troisième valeur max et les noms de col correspondants pour chaque ligne, mais incapables de le faire dans R. S'il vous plaît aider.

Voici comment se ressemble le Dataframe: P>

              X1    X2    X3   X4    X5   X6   X7    X8    X9    X10   X11  X12   
      10003   0.0   0.0   0.0  0.0   0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0       
      10006   0.0   0.0   0.0  0.0   0.0  0.0 16.7   0.0   0.0   0.0   0.0  0.0       
      10007   0.0   0.0   0.0  0.0   0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0       
      10008   0.0   0.0   0.0  0.0   0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0       
      10010   0.0   0.0   0.0  0.0   0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0       
      10014   0.0   0.0   0.0  0.0   0.0  0.0  0.0   0.0   0.0   0.0   0.0  0.0   


14 commentaires

Vos données semblent être tous des zéros à l'exception d'une seule valeur.


Bienvenue dans le débordement de la pile! Pourriez-vous rendre votre problème reproductible en partageant un échantillon de vos données afin que d'autres puissent aider (veuillez ne pas utiliser str () , tête () ou capture d'écran)? Vous pouvez utiliser le repex et < a href = "https://cran.r-project.org/web/web/packages/datapasta/vignettes/how-ta-datapasta.html" rel = "nOfollow noreferrer"> datapasta Forfaits pour vous aider avec ça. Voir aussi Aidez-moi à vous aider & Comment faire un excellent exemple reproductible?


C'est une image de données massive, je viens de poster quelques premières lignes et moins de colonnes.


Votre jeu de données n'est pas reproductible et votre question est vague.


and10003.10006 etc sont des noms de lignes, pas des valeurs .J'ai essayé de fonctionner avec une fonction d'application sur des lignes, mais cela ne me donne pas les colnames


Le titre de la question dit "max" et le texte dit "min"!


Essayé cela, mais a une erreur


Outhata <-SetNames (Data.Frame (T (Appliquer (Appliquer (MAT1_2_DF, 1, Fonction (x) {INT <- QUI.MAX (X) [1] C (IND, X [IND])})), T (Appliquer (MAT1_2_DF, 1, fonction (x) {ind2 <-which.max (x [-ind]) [1] C (IND2, X [IND2])})), T (Appliquer (MAT1_2_DF, 1, fonction (x ) {ind3 <-which.max (x [-c (ind, ind2)]) C (ind3, x [ind3])}))), C ("Premier", "valeur", "Deuxième", "Value2 "," Troisièmement "," Value3 "))


Désolé c'est des valeurs maximales


Avez-vous regardé? Stackoverflow.com/Questtions/2453326/...


Oui, j'ai regardé cela, mais incapable de reproduire sur le Dataframe. Je vais ajouter quelques rangées supplémentaires


Cela ne me permet pas d'ajouter plus de lignes, j'essaie d'obtenir le max, le deuxième et le troisième nom max et les noms de colonne correspondants et, au cas où elles sont des zéros, obtenez toujours au moins un colname correspondant contre 0,0 valeurs.


J'ai inventé ce Dataframe pour l'illustrer mieux.


x1 x2 x3 x4 x5 x5 x6 x8 x8 x8 x8 x8 x8 x8 x 3 22.1 1004A 22.7 0 03.1 1004A 22.7 0 03.1 1004A 22.2 0 13.2 0 5.4 0 9.7 0 0 1005A 0 0 0 0 12 2.1 0 0 3.2 0 1006A 1.2 0 1.2 0 43,9 43.9 0 0 57,6


3 Réponses :


-1
votes

Voici mon approche:

 # Make up data because yours is pretty unreproducible:
 df <- data.frame(X1=1:5, X2=c(3,5,1,6,7))

 # combine and sort the data by decreasing value:
 a <- sort(dplyr::combine(df), decreasing = T)[1:3]

 # For loop to get the indexes:
 for(i in 1:length(a)){
    print(which(df==a[i], arr.ind = T))
 }


0 commentaires

1
votes

Il s'agit des échantillons de données que vous avez postés dans votre commentaire:

# A tibble: 4 x 2
# Groups:   rowname [4]
#   rowname result                   
#   <chr>   <chr>                    
# 1 1003    x2=45.7, x9=23.1, x4=22.9
# 2 1004    x1=22.2, x3=13.2, x7=9.7 
# 3 1005    x4=12, x8=3.2, x5=2.1    
# 4 1006    x9=57.6, x5=43.9, x6=43.9


2 commentaires

Merci pour votre réponse. Mais existe-t-il un moyen simple de faire cela comme je suis nouveau et incapable de comprendre le code ci-dessus et je cherche à obtenir six colonnes contre chaque ligne de Dataframe, trois donnant Max, deuxième max, troisième max et aussi avec leurs collations (par exemple 45.7, X2,23,1, X9,22,9, X4) pour la première rangée.


Je vois ce que tu veux dire. S'il vous plaît jeter un oeil à ma réponse mise à jour.



0
votes

Vous pouvez utiliser

max.names = apply(data, 1, function(x) names(sort(x, decreasing = T)[1:3]))
max.vals = apply(data, 1, function(x) sort(x, decreasing = T)[1:3])
data = cbind(data, t(max.names), t(max.vals))
#        x1   x2   x3   x4   x5   x6  x7  x8   x9  1  2  3    1    2    3
# 1003  0.0 45.7  0.0 22.9  0.0 13.7 0.0 0.0 23.1 x2 x9 x4 45.7 23.1 22.9
# 1004 22.2  0.0 13.2  0.0  5.4  0.0 9.7 0.0  0.0 x1 x3 x7 22.2 13.2  9.7
# 1005  0.0  0.0  0.0 12.0  2.1  0.0 0.0 3.2  0.0 x4 x8 x5 12.0  3.2  2.1
# 1006  1.2  0.0  1.2  0.0 43.9 43.9 0.0 0.0 57.6 x9 x5 x6 57.6 43.9 43.9


0 commentaires