2012-05-22 10 views
11

के लिए पंक्ति और कॉलम हेडर में आयाम नाम शामिल करें यदि आकस्मिक तालिका में विशेषताओं की श्रेणियां केवल संख्याएं हैं, तो केवल इन संख्याओं का उपयोग कॉलम/पंक्ति शीर्षलेख के रूप में पर्याप्त नहीं है - विवरण क्या संख्याएं हैं मतलब के लिए बुलाया जाता है।लाटेक्स-स्वरूपित आकस्मिक तालिका

Example table

किसी को भी आर + LaTeX का उपयोग कर जैसे तालिकाओं के उत्पादन में अनुभव है: नीचे चित्र एक घर के नमूने में विदेशियों के घर के आकार बनाम संख्या के पार वर्गीकरण पता चलता है?

उत्तर

0

वहाँ ftable कि एक दो आयामी स्वरूपित तालिका में एक आपात तालिका बदल जाता है और अनुमति देता है क्या पंक्तियों में दिखाया गया है और क्या कॉलम में (दो से अधिक आयाम की तालिकाओं के लिए भी उपयोगी) को निर्दिष्ट। कोई हैकिंग की जरूरत

library(magrittr) 
library(memisc) 
expand.grid(Foreigners = 0:5, `Total persons` = 1:8) %>% 
    cbind(Freq = rnorm(6*8, 20, 10)) %>% 
    xtabs(formula = Freq~.) %>% 
    ftable %>% 
    toLatex 

, और LaTeX (जैसे रोटेशन और/या एकाधिक पंक्तियों में फैले समर्थन करने के लिए) expand.grid में स्तंभों के नाम के लिए इस्तेमाल किया जा सकता है: memisc पैकेज अच्छा लेटेक्स में इस मोड़ में मदद करता है। जेनरेट किए गए लाटेक्स कोड को booktabs और dcolumn पैकेज की आवश्यकता होती है।

Compiled output

संबंधित: Creating a latex table from ftable object in R

0

यहां एक दृष्टिकोण है। कुछ डेटा के साथ शुरू करें (आपको प्रश्न पोस्ट करते समय ऐसा करना चाहिए) मैट्रिक्स फॉर्म में।

dat<-matrix(round(rnorm(9,20,10)),3,3) 

नामों का एक वेक्टर बनाएं। मैट्रिक्स में नाम लागू करें। मैट्रिक्स

persons<-c(seq("0","2")) 
foreign<-c(seq("0","2")) 
dimnames(dat)<-list(persons=persons, foreign=foreign) 
dat 

आप लेटेक्स-स्वरूपित तालिका आउटपुट करने के लिए xtable का उपयोग कर सकते हैं।

library(xtable) 
xtable(dat) 
+0

निश्चित रूप से मुझे एक न्यूनतम कार्य उदाहरण पोस्ट करना चाहिए था। ऐसा करने के लिए खेद है। अगर आप अपना उदाहरण अनुकूलित करते हैं तो क्या आपको बुरा लगता है? - जेनरेटेड एक्स्टेबल में आयाम नाम शामिल नहीं हैं, हालांकि। – krlmlr

+0

कोई समस्या नहीं है। और हाँ, मुझे बाद में एहसास हुआ कि लेटेक्स आउटपुट में आयाम नाम शामिल नहीं हैं। मेरा दृष्टिकोण संभवतः टेक्क्स में ठीक करने के लिए होगा, हालांकि यदि आप समझते हैं कि इसे सीधे एक्स्टेबल का उपयोग करके कैसे किया जाए तो मुझे बताएं। – charlie

+0

'xtable' समाधान के लिए अपना स्वयं का उत्तर देखें। – krlmlr

6

मेरे पास मेरे बजाय एक हैकिश समाधान है, लेकिन मैं अन्य दृष्टिकोण भी देखना चाहता हूं। बेशक, यह अच्छा होगा अगर इस कोड का एक संस्करण xtable में जोड़ा गया था।

मेरा समाधान तालिका के rownames() और colnames() अद्यतन करने के होते हैं। पंक्ति शीर्षलेख rownames()[1] में जाता है, और कॉलम हेडर colnames()[1] में जाता है। कई चीजों को याद रखना होगा:

  • पंक्ति शीर्षलेखों का उपयोग करते हुए परिणामी तालिका में कॉलम की संख्या एक बड़ी है। इसलिए, उपयोगकर्ता द्वारा tabular पर्यावरण बनाया जाना चाहिए।
  • एक पंक्ति हेडर जोड़ा जाता है, स्तंभ शीर्ष लेख शामिल करने के लिए एक अतिरिक्त &
  • स्वच्छ या अन्यथा पुन: फ़ॉर्मेट मत पंक्ति या इस आपरेशन

add.crosstab.headers समारोह सब कुछ का ख्याल रखता है के बाद स्तंभ नाम है। इसे xtable() कॉल के परिणाम पर लागू किया जा सकता है। कुछ सहायक कार्यों की भी आवश्यकता है।

macrify <- function(m, s, bs='\\') { 
    paste(bs, m, '{', s, '}', sep='') 
} 

boldify <- function(s) { 
    macrify('textbf', s) 
} 

add.crosstab.headers <- function(t, row.header=NA, col.header=NA, 
           sanitize=boldify) { 
    rownames(t) <- sanitize(rownames(t)) 
    colnames(t) <- sanitize(colnames(t)) 
    if (!is.na(row.header)) { 
    colnames(t)[1] <- paste('&', colnames(t)[1]) 
    rownames(t) <- paste('&', rownames(t)) 
    row.header <- sanitize(row.header) 
    row.header <- macrify('rotatebox{90}', row.header) 
    multirow <- macrify('multirow', nrow(t)) 
    multirow <- macrify(multirow, '*', bs='') 
    row.header <- macrify(multirow, row.header, bs='') 
    rownames(t)[1] <- paste(row.header, rownames(t)[1]) 
    } 
    if (!is.na(col.header)) { 
    col.header <- sanitize(col.header) 
    multicolumn <- macrify('multicolumn', ncol(t)) 
    multicolumn <- macrify(multicolumn, 'c', bs='') 
    col.header <- macrify(multicolumn, col.header, bs='') 
    col.header <- paste(col.header, '\\\\\n') 
    col.header <- paste(col.header, '&') 
    if (!is.na(row.header)) { 
     col.header <- paste('&', col.header) 
    } 
    colnames(t)[1] <- paste(col.header, colnames(t)[1]) 
    } 
    t 
} 

उपयोग इस तरह होगा।

dat <- matrix(round(rnorm(9, 20, 10)), 3, 3) 
t <- xtable(dat) 
t <- add.crosstab.headers(t, row.header='Foreigners', col.header='Total persons') 

print.xtable(t, 
      only.contents=TRUE, 
      booktabs=TRUE 
      , sanitize.text.function=identity 
      ) 
संबंधित मुद्दे