2013-06-05 7 views
5

मेरा अनुमान है कि यह ddply का उपयोग करना आसान है, लेकिन मैं अभी भी आर में एक नौसिखिया हूं और इसके चारों ओर अपना सिर नहीं प्राप्त कर सकता।ddply का उपयोग कर डेटाफ्रेम में प्रत्येक सेल के लिए प्रतिशत की गणना कैसे करें?

मैं मैं प्रतिशत में एक समय में एक चर बदल सकता है एक data.frame इस

txt <- "label var1 var2 var3 var4 var5 var6 var7 
lab1 401 80 57 125 118 182 83 
lab2 72 192 80 224 182 187 178 
lab3 7 152 134 104 105 80 130 
lab4 3 58 210 30 78 33 87 
lab5 1 2 3 1 1 2 6" 

mydata <- read.table(textConnection(txt), sep = " ", header = TRUE) 

ऐसा करने की तरह लग रही है

mydata$var1 <- round(prop.table(mydata$var1),3)*100 

लेकिन यह कैसे सभी चर के साथ यह करने के लिए (var1: var7) एक स्ट्रोक में डेटा.फ्रेम में?

नोट: यह एक फ़ंक्शन में जा रहा है, जिसमें समय-समय पर चर की संख्या और भिन्नता भिन्न होती है, और इसलिए कोड को इसके प्रति संवेदनशील होना चाहिए।

अग्रिम में धन्यवाद

उत्तर

4

फैंसी पैकेज की कोई आवश्यकता नहीं है। यह तब तक काम करेगा जब तक आप इसे पहले कॉलम के अलावा करना चाहते हैं। 2:ncol उपयुक्त नहीं है, तो आप कॉलम को शामिल करने के लिए शर्तों को अनुकूलित कर सकते हैं।

require(dplyr) 
require(reshape2) 

mydata %>% melt(id.vars = "label") %>% 
    group_by(variable) %>% 
    mutate(prop = round(value/sum(value) * 100, 3)) %>% 
    dplyr::select(-value) %>% 
    dcast(label ~ variable, fun.aggregate = sum, value.var = "prop") 

लंबे प्रारूप के लिए अपने डेटा कन्वर्ट, अनुपात की गणना:

t(round(t(mydata[, 2:ncol(mydata)])/colSums(mydata[, 2:ncol(mydata)]) * 100, 3)) 

और, जब से तुम पूछा plyr के बारे में और dplyrddply का उन्नत संस्करण है, यहाँ है कि कैसे आप उस के साथ यह कर करेंगे , और इसे वापस व्यापक रूप से स्विच करें। साइमन ओ'नानलॉन एक त्वरित एक-लाइनर के रूप में दिखाता है कि बहुत सारे टाइपिंग, लेकिन dplyr विधि अच्छी तरह से गणना करता है कि आप जो भी प्रकार की गणना करना चाहते हैं।

+0

बहुत बहुत धन्यवाद। यह सही – Einnor

+0

@Einnor काम करता है अगर यह आपके प्रश्न का उत्तर देता है तो आपको इस प्रश्न का उत्तर देने के लिए इसे स्वीकार करने के लिए * (पढ़ें - बाध्य नहीं) पर विचार करना चाहिए। मैंने देखा है कि आपने अभी तक अपने 6 प्रश्नों के उत्तर स्वीकार नहीं किए हैं। आप यह देखने के लिए [** के बारे में **] (http://stackoverflow.com/about) को पढ़ना चाह सकते हैं कि एसओ साइट से अधिक लाभ उठाने में आपकी सहायता के लिए कैसे काम करता है। –

+0

@ साइमन0101 मुझे पता नहीं था कि मुझे जवाब स्वीकार करना चाहिए। लेकिन करेंगे :) – Einnor

2

हो सकता है कि कुछ इस तरह आप मदद कर सकते हैं:

cbind(label=mydat[,1],as.data.frame(apply(mydat[,-1], 2, function(col) round(prop.table(col),3)*100))) 
+0

यह भी काम करता है, धन्यवाद :) – Einnor

+0

आप इसे थोड़ा सा सरल बना सकते हैं: 'data.frame (mydata [1], lapply (mydata [-1], function (x) round (prop.table (x) * 100, 3))) ' – thelatemail

5

बस एक matrix को मजबूर और इतने तरह prop.table को मार्जिन तर्क का उपयोग करें:

round(prop.table(as.matrix(df),2) * 100 , 3) 

उदाहरण

set.seed(123) 
df <- data.frame(matrix(sample(4 , 12 , repl=TRUE) , 3)) 
df 
# X1 X2 X3 X4 
#1 2 4 3 2 
#2 4 4 4 4 
#3 2 1 3 2 
round(prop.table(as.matrix(df),2) * 100 , 3) 
# X1  X2 X3 X4 
#[1,] 25 44.444 30 25 
#[2,] 50 44.444 40 50 
#[3,] 25 11.111 30 25 

के लिए आपके उदाहरण में ऐसा लगता है कि मैंने जो कहा था वह वास्तव में एक है चरित्र मूल्यों का स्तंभ। इस कॉलम को छोड़कर सभी कॉलम पर prop.table का उपयोग करने के लिए आप prop.table(df[,-1] , margin = 2) कर सकते हैं।

+0

धन्यवाद, यह भी काम करता है – Einnor

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