2015-05-27 16 views
5

मुझे पता है कि a little programming निश्चित आयाम आवृत्ति सारणी को परिवर्तित करने की अनुमति देता है, जैसा कि लौटाया गया है उदा। table() द्वारा, अवलोकन डेटा में वापस। तो उद्देश्य वापस एक पंक्ति संख्या है कि इनपुट मैट्रिक्स की संख्याओं का योग से मेल खाती है के साथ एक data.frame() में इसी प्रकार के एक आवृत्ति तालिका कन्वर्ट करने के लिए ...क्या तालिका() फ़ंक्शन का सामान्य उलटा है?

(flower.freqs <- with(iris,table(Petal=cut(Petal.Width,2),Species))) 
      Species 
Petal   setosa versicolor virginica 
    (0.0976,1.3]  50   28   0 
    (1.3,2.5]   0   22  50 

..., जबकि सेल है मूल्यों इनपुट आयामों से प्राप्त कर रहे हैं:

tableinv <- untable <- function(x) { 
    stopifnot(is.table(x)) 
    obs <- as.data.frame(x)[rep(1:prod(dim(x)),c(x)),-length(dim(x))-1] 
    rownames(obs) <- NULL; obs 
} 

> head(tableinv(flower.freqs)); dim(tableinv(flower.freqs)) 
    Petal Species 
1 (0.0976,1.3] setosa 
2 (0.0976,1.3] setosa 
3 (0.0976,1.3] setosa 
4 (0.0976,1.3] setosa 
5 (0.0976,1.3] setosa 
6 (0.0976,1.3] setosa 
[1] 150 2 
> head(tableinv(Titanic)); nrow(tableinv(Titanic))==sum(Titanic) 
    Class Sex Age Survived 
1 3rd Male Child  No 
2 3rd Male Child  No 
3 3rd Male Child  No 
4 3rd Male Child  No 
5 3rd Male Child  No 
6 3rd Male Child  No 
[1] TRUE 

मैं Obvio हूँ:

 Petal Species 
1 (0.0976,1.3] setosa 
2 (0.0976,1.3] setosa 
3 (0.0976,1.3] setosa 
# ... (150 rows) ... 
कुछ फेरबदल के साथ

मैं एक मोटा प्रोटोटाइप कि भी उच्च आयामी आदानों पचाने चाहिए निर्माण हमें गर्व है कि इस bricolage बहु-गुण data.frame() उच्च 0 आयामी आवृत्ति सारणी जैसे Titanic से पुनर्निर्मित करता है - लेकिन वहां एक स्थापित (अंतर्निहित, युद्ध-परीक्षण) सामान्य तालिका() के विपरीत है, आदर्श रूप से जो कि इस पर निर्भर नहीं है विशिष्ट लाइब्रेरी, जो अनलॉक किए गए आयामों को संभालने के बारे में जानता है, जिसे अनुकूलित किया गया है ताकि यह भारी इनपुट पर चकित न हो, और यह उचित रूप से टेबल इनपुट के साथ सौदा करता है जो कारक के साथ-साथ गैर-कारक अवलोकन इनपुट के अनुरूप होगा?

+3

पता नहीं है कि 'टेबल' के विपरीत है या नहीं, लेकिन मुझे लगता है कि आप अपना कोड थोड़ा सुधार सकते हैं। उदाहरण के लिए, मैं बस कोशिश करता हूं: 'lev <-expand.grid (dimnames (mytable)); lev [rep (1: nrow (lev), as.vector (mytable)),] – nicola

+0

@ निकोला: आप हैं ठीक है, धन्यवाद। और एक और अस्थायी टिप्पणी (जिसे किसी ने जल्द ही वापस ले लिया था) ने यह भी सुझाव दिया कि 'as.data.frame.table() 'हमें आधा रास्ते लाएगा ... – texb

+1

आवश्यक रूप से बेहतर नहीं है, लेकिन एक बार जब आप' as.data.frame 'का उपयोग करते हैं , आप कर सकते हैं: 'डीएफ [प्रतिनिधि (राउनम्स (डीएफ), डीएफ $ फ्रीक), -नकोल (डीएफ)] 'जो अधीर रूप से थोड़ा सा सरल लगता है। – BrodieG

उत्तर

0

मेरा मानना ​​है कि आपका समाधान बहुत अच्छा है। किसी भी मामले में, जिस तरह से मैं इस सवाल को संबोधित करेंगे काफी समान है:

tableinv <- function(x){ 
     y <- x[rep(rownames(x),x$Freq),1:(ncol(x)-1)] 
     rownames(y) <- c(1:nrow(y)) 
     return(y)} 
survivors <- as.data.frame(Titanic) 
surv.invtab <- tableinv(survivors) 

जो पैदावार

> head(surv.invtab) 
    Class Sex Age Survived 
1 3rd Male Child  No 
2 3rd Male Child  No 
3 3rd Male Child  No 
4 3rd Male Child  No 
5 3rd Male Child  No 
6 3rd Male Child  No 

फूलों के साथ उदाहरण के संबंध में, समारोह tableinv() का उपयोग कर ऊपर परिभाषित है, यह पहले किया जाएगा

flower.freqs <- with(iris,table(Petal=cut(Petal.Width,2),Species)) 
flower.freqs <- as.data.frame(flower.freqs) 
flower.invtab <- tableinv(flower.freqs) 

इस मामले में परिणाम

है: एक डेटा फ्रेम में डेटा परिवर्तित करने के लिए आवश्यक
> head(flower.invtab) 
     Petal Species 
1 (0.0976,1.3] setosa 
2 (0.0976,1.3] setosa 
3 (0.0976,1.3] setosa 
4 (0.0976,1.3] setosa 
5 (0.0976,1.3] setosa 
6 (0.0976,1.3] setosa 

उम्मीद है कि इससे मदद मिलती है।

संबंधित मुद्दे