web-dev-qa-db-fra.com

Comment obtenir le numéro d'index de ligne dans R?

Supposons que j'ai une liste ou un cadre de données dans R et que j'aimerais obtenir l'index de ligne, comment puis-je le faire? C'est-à-dire que j'aimerais savoir combien de lignes une matrice donnée contient.

47

J'interprète votre question comme visant à obtenir des numéros de rangée. 

  • Vous pouvez essayer as.numeric(rownames(df)) si vous n'avez pas défini les noms de domaine. Sinon, utilisez une séquence de 1:nrow(df)
  • La fonction which() convertit un index de ligne TRUE/FALSE en numéros de ligne. 
64
Shane

Ce que vous essayez de faire n'est pas très clair.

Pour référencer une ligne dans un bloc de données, utilisez df[row,]

Pour obtenir la première position dans un vecteur de quelque chose, utilisez match(item,vector), où le vecteur pourrait être l'une des colonnes de votre cadre de données, par exemple df$cname si le nom de la colonne est cname.

Modifier:

Pour les combiner, vous écririez:

df[match(item,df$cname),]

Notez que la correspondance vous donne le premier élément de la liste. Par conséquent, si vous ne recherchez pas un numéro de référence unique, vous voudrez peut-être envisager autre chose.

13
James

Voir row dans ?base::row. Cela donne les index de ligne pour tout objet de type matrice.

10
Dean Eckles

Si je comprends votre question, vous voulez simplement pouvoir accéder aux éléments d’un bloc de données (ou d’une liste) par ligne :

x = matrix( ceiling(9*runif(20)), nrow=5  )   
colnames(x) = c("col1", "col2", "col3", "col4")
df = data.frame(x)      # create a small data frame

df[1,]                  # get the first row
df[3,]                  # get the third row
df[nrow(df),]           # get the last row

lf = as.list(df)        

lf[[1]]                 # get first row
lf[[3]]                 # get third row

etc.

4
doug

Cet exemple complémentaire de "match" serait peut-être utile.

Avoir deux jeux de données: 

first_dataset <- data.frame(name = c("John", "Luke", "Simon", "Gregory", "Mary"),
                            role = c("Audit", "HR", "Accountant", "Mechanic", "Engineer"))

second_dataset <- data.frame(name = c("Mary", "Gregory", "Luke", "Simon"))

Si la colonne de nom contient uniquement des valeurs uniques parmi les collections (dans l'ensemble de la collection) .__, vous pouvez accéder aux lignes d'un autre ensemble de données par la valeur de l'index renvoyé par la correspondance.

name_mapping <- match(second_dataset$name, first_dataset$name)

match renvoie les index de ligne appropriés des noms dans first_dataset à partir des noms donnés en deuxième: 5 4 2 1 exemple ici - accès aux rôles du premier ensemble de données par index de ligne

for(i in 1:length(name_mapping)) {
    role <- as.character(first_dataset$role[name_mapping[i]])   
    second_dataset$role[i] = role
}

===

second dataset with new column:
     name       role
1    Mary   Engineer
2 Gregory   Mechanic
3    Luke Supervisor
4   Simon Accountant

r

0
szymon-m