dplyr

2016-04-18 29 views
9

में add_rownames में फ़ंक्शन के विपरीत एक मध्यवर्ती चरण के रूप में मैं एक कॉलम के साथ डेटा फ्रेम को चरित्र तारों के रूप में उत्पन्न करता हूं और शेष संख्याएं होती हैं। मैं इसे एक मैट्रिक्स में रूपांतरित करना चाहता हूं, लेकिन पहले मुझे उस वर्ण कॉलम को पंक्ति नामों में परिवर्तित करना होगा और इसे डेटा फ्रेम से हटा देना होगा।dplyr

क्या dplyr में ऐसा करने का कोई आसान तरीका है? to_rownames() जैसे फ़ंक्शन add_rownames() के विपरीत है?

मैंने एक कस्टम फ़ंक्शन का उपयोग करके solution देखा, लेकिन यह वास्तव में dplyr दर्शन से बाहर है।

+0

मुझे नहीं लगता कि dplyr दर्शन गैर data.frames धरना के लिए है। इसकी वर्तमान टैगलाइन "डेटा फ्रेम के लिए विशेष रूप से विशिष्ट है" https://github.com/hadley/dplyr – Frank

+0

@ फ्रैंक, डेटा फ्रेम को मैट्रिक्स में कनवर्ट करने के लिए फ़ंक्शन का उपयोग आवश्यक नहीं है। क्या होगा यदि मुझे मौजूदा फ़ील्ड के आधार पर पंक्ति नाम बदलने की जरूरत है? या पूरी तरह से dplyr दर्शन से पंक्ति नाम का उपयोग कर? – yuk

+2

एचएम, मुझे नहीं पता। पैकेज में मेरी अंतर्दृष्टि टैगलाइन से काफी दूर नहीं जाती है :) आप यहां रेनमार्क के खिलाफ हैडली बोल सकते हैं, हालांकि: https://github.com/hadley/tibble/blob/master/R/rownames.R ओह, और ऐसा लगता है कि वहां वास्तव में 'column_to_rownames' फ़ंक्शन है। – Frank

उत्तर

7

इस एनएसई & मानक 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 

शायद to_rownames() या set_rownames() अधिक समझ में आता है। ¯\_(ツ)_/¯ वाईएमएमवी।

+0

यह एक अच्छा काम है। एनएसई का उपयोग करने के बारे में बहुत कुछ सीख लिया। धन्यवाद! यह बहुत अच्छा होगा अगर @ हैडली इस समारोह के संभावित समावेशन पर टिप्पणी कर सकते हैं। – yuk

+0

यह अब टिब्बल पर काम नहीं करता है। यह फेंकता है 'एक टिब्बल पर पंक्ति नाम सेट करना बहिष्कृत है।' – Rentrop

+0

इसका मतलब यह नहीं है कि यह काम नहीं करता है। यह सिर्फ एक बहिष्कार चेतावनी है। – hrbrmstr

1

तुम सच में एक मैट्रिक्स तुम सिर्फ एक अलग चर के चरित्र स्तंभ को बचा सकता है की जरूरत है, इसे छोड़, और फिर मैट्रिक्स बनाने

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 

यकीन है, तो आप उस के बाद क्या करने जा रहे हैं क्या नहीं, लेकिन यह आप जहां तक ​​हो जाता है के रूप में आप से पूछा के लिए ...

10

अब आप Tibble-पैकेज का उपयोग कर सकते हैं:

tibble::column_to_rownames() 
+0

आप सबसे अच्छे हैं! –