2016-04-18 21 views
9

Jako etap pośredni generuję ramkę danych z jedną kolumną jako ciągami znaków, a reszta to liczby. Chciałbym przekonwertować go do macierzy, ale najpierw muszę przekonwertować kolumnę tego znaku na nazwy wierszy i usunąć je z ramki danych.Funkcja przeciwna do add_rownames w dplyr

Czy jest to prosty sposób, aby to zrobić w dplyr? Funkcja taka jak to_rownames(), która jest przeciwna do add_rownames()?

Widziałem solution za pomocą niestandardowej funkcji, ale tak naprawdę nie ma w niej filozofii dplyr.

+0

nie sądzę filozofia dplyr ma obejmować nie-data.frames. Jego obecny slogan to "plyr specjalizuje się w ramkach danych" https://github.com/hadley/dplyr – Frank

+0

@Frank, Funkcja ta nie jest konieczna do użycia do konwersji ramki danych do macierzy. Co się stanie, jeśli będę musiał zmienić nazwy wierszy na podstawie istniejącego pola? Czy w ogóle używa się nazw wierszy z filozofii dplyr? – yuk

+2

Hm, nie wiem. Mój wgląd w paczkę nie wykracza daleko poza slogan :) Możesz zobaczyć hadley przemawiający przeciw rownames tutaj, chociaż: https://github.com/hadley/tibble/blob/master/R/rownames.R Aha, i wygląda na to, że rzeczywiście istnieje tam funkcja 'column_to_rownames'. – Frank

Odpowiedz

7

zapewnia NSE & standardowych funkcji 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 

Może to_rownames() lub set_rownames() ma więcej sensu. ¯\_(ツ)_/¯ YMMV.

+0

To fajna funkcja. Nauczyłem się dużo o używaniu NSE. Dzięki! Byłoby wspaniale, gdyby @hadley mógł skomentować ewentualne włączenie tej funkcji do dplyr. – yuk

+0

Ta funkcja nie działa już przy przekąskach. Rzucane 'Ustawienie nazw wierszy na tibble jest przestarzałe. – Rentrop

+0

To nie znaczy, że nie działa. To tylko ostrzeżenie o wycofaniu. – hrbrmstr

1

Jeśli naprawdę potrzebujesz matrycę można po prostu zapisać kolumnę znaków do osobnej zmiennej, upuszczać go, a następnie utworzyć macierz

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 

Nie wiesz, co masz zamiar zrobić po tym, ale to dostaje się tak daleko, jak prosiłeś ...

10

Możesz teraz użyć tibble-pakiet:

tibble::column_to_rownames() 
+0

jesteś najlepszy! –