2015-04-08 15 views
55

Ho un frame di dati come questo:Convertire nomi di riga nella prima colonna

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" 

voglio convertire i nomi di riga nella prima colonna. Attualmente io uso qualcosa di simile a questo per fare i nomi delle righe come la prima colonna:

d <- df 
    names <- rownames(d) 
    rownames(d) <- NULL 
    data <- cbind(names,d) 

C'è una sola linea per fare questo?

+0

possibile duplicato di [R: convertire i nomi di riga in più frame di dati per colonna in frame di dati] (http://stackoverflow.com/questions/18403199/r-converting-row-names-in-multiple- data-frame-to-column-in-data-frame) – rmuc8

+0

Non hai bisogno di pacchetti extra, ecco un one-liner: 'd <- cbind (rownames (d), data.frame (d, row.names = NULL)) ' – ssp3nc3r

risposta

51

È possibile entrambi nomi fila rimuovere e convertirli in una colonna con riferimento (senza riallocando memoria utilizzando ->) utilizzando setDT e la sua keep.rownames = TRUE tesi dal pacchetto 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 
+3

Usa' 'colnames (df) [1] <-" newname "' 'per rinominare la prima colonna se necessario. – Swetabh

+3

@Swetabh Bene, no. 'setnames (df, 1," newname ")' è il metodo 'data.table'. –

57

Oppure si può usare dplyr 's add_rownames che fa la stessa cosa della risposta di David:

library(dplyr) 
df <- add_rownames(df, "VALUE") 

UPDATE (metà 2016):

add_rownames() è obsoleta e viene sostituito da tibble::rownames_to_column() (stesse funzioni, ma Hadley rifattorizzata dplyr un bit).

+11

Non * esattamente * uguale, perché non lo fa * per riferimento * :) –

36

Un'opzione una riga è:

df$names <- rownames(df) 
+3

Spero che tu sappia che aggiunge 'rownames' come una colonna all'ultimo, anzi non come una prima colonna. –

+0

Buon punto. Quindi, non così una nave di linea, dopo tutto. :) – Emily

+2

Com'è diverso da ciò che l'OP ha già provato? Sapevano già di "rownames", no? Volevano metterlo all'inizio però. –

3

In alternativa, è possibile creare un nuovo dataframe (o sovrascrivere quello attuale, come dimostra l'esempio di seguito) in modo da non avere bisogno di usare di tutto il pacchetto esterni. Tuttavia, in questo modo potrebbe non essere efficiente con enormi dataframes.

df <- data.frame(names = row.names(df), df) 
+0

Oppure: 'df <- cbind (names = rownames (df), df)' –

Problemi correlati