web-dev-qa-db-fra.com

Ajouter une colonne d'index (ID numérique) à un cadre de données volumineux

J'ai lu un gros fichier csv dans un cadre de données. Les données contenues dans le fichier csv proviennent de plusieurs sites Web représentant des informations sur l'utilisateur. Par exemple, voici la structure du bloc de données.

user_id, number_of_logins, number_of_images, web
001, 34, 3, aa.com
002, 4, 4, aa.com
034, 3, 3, aa.com
001, 12, 4, bb.com
002, 1, 3, bb.com
034, 2, 2, cc.com

comme vous pouvez le voir une fois que j'apporte les données dans la trame de données, user_id n'est plus un identifiant unique, ce qui entraîne toute l'analyse. J'essaie d'ajouter d'autres colonnes avant user_id qui s'apparente à "generated_uid" et j'utilise assez bien l'index du data.frame à remplir par cette colonne. Quel est le meilleur moyen d'y parvenir?.

60
add-semi-colons

Vous pouvez très facilement ajouter une séquence de chiffres avec

data$ID <- seq.int(nrow(data))

Bien sûr, cela n’aura pas de véritable sens, il pourrait donc ne pas être utile en analyse.

Si vous utilisez déjà library(tidyverse), vous pouvez utiliser

data <- tibble::rowid_to_column(data, "ID")
141
MrFlick

Utilisation du package dplyr alternatif:

library("dplyr") # or library("tidyverse")

df <- df %>% mutate(id = row_number())
41
woshishui

Si votre data.frame est un data.table, vous pouvez utiliser le symbole spécial .I:

data[, ID := .I]
13
Hugh

Eh bien, si je vous comprends bien. Vous pouvez faire quelque chose comme ce qui suit.

Pour le montrer, je crée d'abord un data.frame avec votre exemple

df <- 
scan(what = character(), sep = ",", text =
"001, 34, 3, aa.com
002, 4, 4, aa.com
034, 3, 3, aa.com
001, 12, 4, bb.com
002, 1, 3, bb.com
034, 2, 2, cc.com")

df <- as.data.frame(matrix(df, 6, 4, byrow = TRUE))
colnames(df) <- c("user_id", "number_of_logins", "number_of_images", "web")  

Vous pouvez ensuite exécuter l'une des lignes suivantes pour ajouter une colonne (à la fin du data.frame) avec le numéro de la ligne comme identifiant d'utilisateur généré. Les deuxièmes lignes ajoutent simplement des zéros non significatifs.

df$generated_uid  <- 1:nrow(df)
df$generated_uid2 <- sprintf("%03d", 1:nrow(df))

Si vous voulez absolument que l'ID utilisateur généré soit la première colonne, vous pouvez ajouter la colonne comme suit:

df <- cbind("generated_uid3" = sprintf("%03d", 1:nrow(df)), df)

ou simplement réorganiser les colonnes.