J'ai un cadre de données comme ceci:
df
VALUE ABS_CALL DETECTION P-VALUE
1007_s_at "957.729231881542" "P" "0.00486279317241156"
1053_at "320.632701283368" "P" "0.0313356324173416"
117_at "429.842323161046" "P" "0.0170004527476119"
121_at "2395.7364289242" "P" "0.0114473584876183"
1255_g_at "116.493632746934" "A" "0.39799368200131"
1294_at "739.927122116896" "A" "0.0668649772942343"
Je veux convertir les noms de ligne dans la première colonne. Actuellement, j'utilise quelque chose comme ceci pour créer des noms de ligne dans la première colonne:
d <- df
names <- rownames(d)
rownames(d) <- NULL
data <- cbind(names,d)
Y a-t-il une seule ligne pour faire cela?
Vous pouvez les deux supprimer les noms de ligne et les convertir en colonne par référence (sans réaffecter la mémoire à l'aide de ->
) à l'aide de setDT
et de son keep.rownames = TRUE
argument du package data.table
library(data.table)
setDT(df, keep.rownames = TRUE)[]
# rn VALUE ABS_CALL DETECTION P.VALUE
# 1: 1 1007_s_at 957.7292 P 0.004862793
# 2: 2 1053_at 320.6327 P 0.031335632
# 3: 3 117_at 429.8423 P 0.017000453
# 4: 4 121_at 2395.7364 P 0.011447358
# 5: 5 1255_g_at 116.4936 A 0.397993682
# 6: 6 1294_at 739.9271 A 0.066864977
Comme mentionné par @snoram, vous pouvez attribuer à la nouvelle colonne le nom de votre choix, par exemple. setDT(df, keep.rownames = "newname")
ajouterait "newname" comme colonne de lignes.
Ou vous pouvez utiliser add_rownames
de dplyr
qui fait la même chose que la réponse de David:
library(dplyr)
df <- tibble::rownames_to_column(df, "VALUE")
UPDATE (mi-2016): (incorporé à ce qui précède)
l'ancienne fonction appelée add_rownames()
est devenue obsolète et est remplacée par tibble::rownames_to_column()
(mêmes fonctions, mais Hadley a refactorisé dplyr
un bit).
Une option d'une ligne est:
df$names <- rownames(df)
Sinon, vous pouvez créer une nouvelle image (ou écraser l'image actuelle, comme dans l'exemple ci-dessous), de sorte que vous n'avez pas besoin d'utiliser de package externe. Cependant, cette façon peut ne pas être efficace avec des trames de données énormes.
df <- data.frame(names = row.names(df), df)
Déplacé mon commentaire dans une réponse par suggestion ci-dessus:
Vous n'avez pas besoin de paquets supplémentaires, voici un one-liner:
d <- cbind(rownames(d), data.frame(d, row.names=NULL))
dplyr::as_data_frame(df, rownames = "your_row_name")
vous donnera un résultat encore plus simple.