web-dev-qa-db-fra.com

Créer une colonne ID (numéro de ligne)

Je dois créer une colonne avec un identifiant unique, en gros, ajouter le numéro de la ligne comme une colonne propre Mon bloc de données actuel ressemble à ceci:

   V1  V2
1  23  45
2  45  45
3  56  67

Comment le faire ressembler à ceci:

V1  V2  V3
1  23  45
2  45  45
3  56  67

? Merci beaucoup

16
user10745

Vous pouvez utiliser cbind:

d <- data.frame(V1=c(23, 45, 56), V2=c(45, 45, 67))

## enter id here, you could also use 1:nrow(d) instead of rownames
id <- rownames(d)
d <- cbind(id=id, d)

## set colnames to OP's wishes
colnames(d) <- paste0("V", 1:ncol(d))

EDIT: Voici une comparaison des suggestions de @dacko. d$id <- seq_len(nrow(d) est légèrement plus rapide, mais l'ordre des colonnes est différent (id est la dernière colonne; les réorganiser semble être plus lent que d'utiliser cbind):

library("microbenchmark")

set.seed(1)
d <- data.frame(V1=rnorm(1e6), V2=rnorm(1e6))

cbindSeqLen <- function(x) {
  return(cbind(id=seq_len(nrow(x)), x))
}

dickoa <- function(x) {
  x$id <- seq_len(nrow(x))
  return(x)
}

dickoaReorder <- function(x) {
  x$id <- seq_len(nrow(x))
  nc <- ncol(x)
  x <- x[, c(nc, 1:(nc-1))]
  return(x)
}

microbenchmark(cbindSeqLen(d), dickoa(d), dickoaReorder(d), times=100)

# Unit: milliseconds
#             expr      min       lq   median       uq      max neval
#   cbindSeqLen(d) 23.00683 38.54196 40.24093 42.60020 47.73816   100
#        dickoa(d) 10.70718 36.12495 37.58526 40.22163 72.92796   100
# dickoaReorder(d) 19.25399 68.46162 72.45006 76.51468 88.99620   100
18
sgibb

Vous pouvez aussi faire ceci en utilisant dplyr:

DF <- mutate(DF, id = rownames(DF))
18
WhiskeyGolf

Deux tidyverse alternatives (en utilisant les données d'exemple de sgibb):

tibble::rowid_to_column(d, "ID")

qui donne:

  ID V1 V2
1  1 23 45
2  2 45 45
3  3 56 67

Ou:

dplyr::mutate(d, ID = row_number())

qui donne:

  V1 V2 ID
1 23 45  1
2 45 45  2
3 56 67  3

Comme vous pouvez le constater, la fonction rowid_to_column- ajoute la nouvelle colonne devant les autres tandis que la combinaison mutate & row_number()- ajoute la nouvelle colonne après les autres.


Et une autre alternative de base R:

d$ID <- seq_along(d[,1])
7
Jaap

solution data.table

Syntaxe plus simple et beaucoup plus rapide

library(data.table)

dt <- data.table(V1=c(23, 45, 56), V2=c(45, 45, 67))

setnames(dt, c("V2", "V3")) # changing column names
dt[, V1 := .I] # Adding ID column
4
altabq

J'espère que cela aidera. Le moyen le plus court et le meilleur de créer une colonne ID est:

dataframe$ID <- seq.int(nrow(dataframe))
2
mehakVT

Beaucoup ont présenté leurs idées, mais je pense que this est le code le plus court et le plus simple pour cette tâche:

data$ID <- 1:nrow(data)

Une ligne. Le seul et unique.

0
Eric Lino