2016-04-18 15 views
9

Come fase intermedia, viene generato un frame di dati con una colonna come stringhe di caratteri e il resto sono numeri. Mi piacerebbe convertirlo in una matrice, ma prima devo convertire quella colonna di caratteri in nomi di riga e rimuoverla dal frame di dati.Funzione opposta per add_rownames in dplyr

C'è un modo semplice per farlo in dplyr? Una funzione come to_rownames() è opposta a add_rownames()?

Ho visto un solution utilizzando una funzione personalizzata, ma è davvero fuori dalla filosofia di dplyr.

+0

Non credo che la filosofia dplyr ha lo scopo di comprendere i non-data.frames. Il suo slogan attuale è "plyr specializzato per i frame di dati" https://github.com/hadley/dplyr – Frank

+0

@Frank, la funzione non è necessaria per convertire il frame di dati in matrice. Cosa succede se ho solo bisogno di cambiare i nomi delle righe in base al campo esistente? O usare i nomi delle righe fuori dalla filosofia di dplyr? – yuk

+2

Hm, non lo so. La mia visione del pacchetto non va molto oltre la tagline :) Puoi vedere Hadley parlare contro i nomi dei giocatori qui, però: https://github.com/hadley/tibble/blob/master/R/rownames.R Oh, e sembra che ci sia davvero una funzione 'column_to_rownames' lì. – Frank

risposta

7

Questo fornisce NSE & funzioni standard: eval

library(dplyr) 

df <- data_frame(a=sample(letters, 4), b=c(1:4), c=c(5:8)) 

reset_rownames <- function(df, col="rowname") { 
    stopifnot(is.data.frame(df)) 
    col <- as.character(substitute(col)) 
    reset_rownames_(df, col) 
} 

reset_rownames_ <- function(df, col="rowname") { 
    stopifnot(is.data.frame(df)) 
    nm <- data.frame(df)[, col] 
    df <- df[, !(colnames(df) %in% col)] 
    rownames(df) <- nm 
    df 
} 

m <- "rowname" 

head(as.matrix(reset_rownames(add_rownames(mtcars), "rowname"))) 
##     mpg cyl disp hp drat wt qsec vs am gear carb 
## Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
## Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
## Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

head(as.matrix(reset_rownames_(add_rownames(mtcars), m))) 
##     mpg cyl disp hp drat wt qsec vs am gear carb 
## Mazda RX4   21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 
## Mazda RX4 Wag  21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 
## Datsun 710  22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
## Valiant   18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 

Forse to_rownames() o set_rownames() ha più senso. ¯\_(ツ)_/¯ YMMV.

+0

È una funzione interessante. Ho imparato molto sull'utilizzo di NSE. Grazie! Sarebbe bello se @hadley potesse commentare la possibile inclusione di questa funzione in dplyr. – yuk

+0

Questo non funziona più su tibbles. Getta 'L'impostazione dei nomi di riga su un tibble è deprecata. – Rentrop

+0

Ciò non significa che non funzioni. È solo un avvertimento di deprecazione. – hrbrmstr

1

Se davvero bisogno di una matrice si può solo salvare la colonna di carattere a una variabile indipendente, cadere, e quindi creare la matrice

library(dplyr) 

df <- data_frame(a = sample(letters, 4), b = c(1:4), c = c(5:8)) 

letters <- df %>% select(a) 
a.matrix <- df %>% select(-a) %>% as.matrix 

Non sei sicuro di che cosa avete intenzione di fare dopo che, ma questo si ottiene, per quanto è chiesto ...

10

È ora possibile utilizzare il Tibble-package:

tibble::column_to_rownames() 
+0

sei il migliore! –