2016-04-18 21 views
9

Ara adım olarak, karakter dizileri olarak bir sütunu olan bir veri çerçevesi oluşturuyorum ve geri kalan sayılardır. Onu bir matrise dönüştürmek istiyorum, ancak önce bu karakter sütununu satır adlarına dönüştürmem ve veri çerçevesinden kaldırmam gerekiyor.dplyr içinde add_rownames işlevinin tersi işlev

dplyr'da bunu yapmak için basit bir yol var mı? add_rownames()'un tersi olan to_rownames() gibi bir işlev?

Özel bir işlev kullanarak bir solution gördüm, ancak gerçekten dplyr felsefesinin dışında.

+0

Ben dplyr felsefesi olmayan data.frames kapsamına almaktadır sanmıyorum. Mevcut sloganı "veri çerçeveleri için uzman" plyr "https://github.com/hadley/dplyr – Frank

+0

@ Frank, Veri çerçevesini matrise dönüştürmek için işlev gerekli değildir. Sadece mevcut alana göre satır adlarını değiştirmem gerekirse ne olur? Ya da dplyr felsefesi dışındaki satır isimlerini kullanarak? – yuk

+2

Hm, Bilmiyorum. Paketle ilgili içgörülerim, sloganın çok ötesine geçmez :) Burada hadleyle konuşan hadley'i görebilirsiniz: https://github.com/hadley/tibble/blob/master/R/rownames.R Oh, ve Orada gerçekten bir 'column_to_rownames' işlevi var gibi görünüyor. – Frank

cevap

7

Bu NSE & standart eval fonksiyonları sağlar için ... sorulan olarak:

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 
Belki

to_rownames() veya set_rownames() daha anlamlı. ¯\_(ツ)_/¯ YMMV.

+0

Bu harika bir işlev. NSE kullanımı hakkında çok şey öğrendim. Teşekkürler! @hadley bu işlevin olası olarak dplyr'a eklenmesini yorumlayabilirse harika olurdu. – yuk

+0

Bu artık tibbles üzerinde çalışmıyor. Fırlatıyor 'Bir satırdaki satır adlarını ayarlama onaylanmaz. ' – Rentrop

+0

Bu işe yaramadığı anlamına gelmez. Bu sadece bir kullanım dışı bırakma uyarısı. – hrbrmstr

1

gerçekten sadece ayrı değişkene karakter sütunu kaydedebilen bir matris gerekiyorsa, bırakın ve sonra matris oluşturmak

, bundan sonra sen yapacaksın neler
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 

Emin değilim ama bu bildiğim kadarıyla seni alır sizi

10

Artık Tibble-paketini kullanabilirsiniz:

tibble::column_to_rownames() 
+0

en iyisisin! –