2010-07-27 24 views
6

के स्तंभों मैं एक data.frame कि इसआर: कुल एक data.frame

> head(df) 
      Memory Memory Memory Memory Memory  Naive  Naive 
10472501 6.075714 5.898929 6.644946 6.023901 6.332126 8.087944 7.520194 
10509163 6.168941 6.495393 5.951124 6.052527 6.404401 7.152890 8.335509 
10496091 10.125575 9.966211 10.075613 10.310952 10.090649 11.803949 11.274480 
10427035 6.644921 6.658567 6.569745 6.499243 6.990852 8.010784 7.798154 
10503695 8.379494 8.153917 8.246484 8.390747 8.346748 9.540236 9.091740 
10451763 10.986717 11.233819 10.643245 10.230697 10.541396 12.248487 11.823138 

की तरह लग रहा है और मैं Memory स्तंभों की मतलब और Naive स्तंभों की मतलब खोजने के लिए चाहते हैं। aggregate फ़ंक्शन पंक्तियों को जोड़ता है। यह data.frame संभावित पंक्तियों की एक बड़ी संख्या हो सकता था, और इसलिए तो transposing मूल data.frame की colnames द्वारा aggregate लागू करने के रूप में मुझे बुरा हमलों, और आम तौर पर परेशान है:

> head(t(aggregate(t(df),list(colnames(df)), mean))) 
     [,1]  [,2]  
Group.1 "Memory" "Naive" 
10472501 "6.195123" "8.125439" 
10509163 "6.214477" "7.733625" 
10496091 "10.11380" "11.55348" 
10427035 "6.672665" "8.266854" 
10503695 "8.303478" "9.340436" 

क्या blindingly स्पष्ट बात मैं याद कर रहा हूँ है ?

+1

उत्सुक आंखों के बीच में आप देखेंगे कि 8.12 8.08 और 7.52 की औसत नहीं है: वहाँ कुछ और स्तंभ हैं वास्तव में। हालांकि बहुत कुछ नहीं! –

उत्तर

8

कुछ के बारे में मैं डेटा को पुन: फ़ॉर्मेट का एक बड़ा वकील हूँ इतना है कि यह एक "लंबे समय" प्रारूप में है। लंबे प्रारूप की उपयोगिता विशेष रूप से स्पष्ट होती है जब इस तरह की समस्याओं की बात आती है। सौभाग्य से, reshape पैकेज के साथ लगभग किसी भी प्रारूप में इस तरह के डेटा को दोबारा बदलने के लिए काफी आसान है।

यदि मैं आपका प्रश्न सही समझ गया, तो आप प्रत्येक पंक्ति के लिए Memory और Naive का अर्थ चाहते हैं। किसी भी कारण से, हमें reshape::melt() के लिए कॉलम नाम अद्वितीय बनाने की आवश्यकता है।

colnames(df) <- paste(colnames(df), 1:ncol(df), sep = "_") 

फिर, आपको ID कॉलम बनाना होगा। आप

df$ID <- 1:nrow(df) 

कर सकता है या तो या, यदि उन rownames सार्थक हैं

df$ID <- rownames(df) 

अब, reshape पैकेज

library(reshape) 
df.m <- melt(df, id = "ID") 
df.m <- cbind(df.m, colsplit(df.m$variable, split = "_", names = c("Measure", "N"))) 
df.agg <- cast(df.m, ID ~ Measure, fun = mean) 

df.agg के साथ अब अपने वांछित उत्पादन SNIPPIT तरह दिखना चाहिए।

या, यदि आप सभी पंक्तियों में केवल समग्र साधन चाहते हैं, तो जैक का सुझाव काम करेगा। जैसे

m <- colMeans(df) 
tapply(m, colnames(df), mean) 

कुछ आप एक ही परिणाम प्राप्त कर सकते हैं, लेकिन जोनाथन चांग के जवाब स्पष्ट करने के लिए

cast(df.m, .~variable, fun = mean) 
+0

जो टिक को दे रहा है क्योंकि यह चीजों को करने का सही तरीका प्रतीत होता है, इसलिए बहुत बहुत धन्यवाद! लेकिन हाँ, जैसा कि जॉन कहता है, मैं जिस चीज को याद कर रहा था वह बस पंक्ति थी, जो कि काम करता है, जो कुछ है जो मैं फिर से नहीं भूलूंगा! –

+0

एआरएम - त्वरित प्रश्न। कोई विचार क्यों 's <- cast (df.m, ID ~ variable, fun = var) 'मुझे शून्य का एक गुच्छा देता है, जब' fun = mean' ठीक काम करता प्रतीत होता है और 'fun = sum' भी काम करता है? इन कॉलम का भिन्नता शून्य नहीं है। –

+0

अच्छा पकड़ो! मुझे नहीं पता कि सौदा क्या था, लेकिन चूंकि स्तंभ नाम अद्वितीय नहीं थे, इसलिए वे सही ढंग से पिघल गए नहीं। मैंने अपना जवाब संपादित कर दिया है ताकि इसे अभी काम करना चाहिए! – JoFrhwld

0

मुझे लगता है कि आपने header=TRUE के बिना अपना डेटा लोड किया है और आपके पास एक कारक मैट्रिक्स है, और इसलिए आपका आम तौर पर अच्छा विचार विफल रहता है।

3

क्या तरह

lapply(unique(colnames(df)), function(x) rowMeans(df[,colnames(df) == x])) 
+0

धन्यवाद योनातन! यह मेरे दिमाग का कुछ हिस्सा मुझे बता रहा था कि मैं इसे याद नहीं कर सका। –

3

के साथ एक dataframe के रूप में स्वरूपित ... आँख बंद करके स्पष्ट बात से वंचित हो रहे है कि आप बस कर सकते हैं है कॉलम का चयन करें और rowMeans कमांड जारी करें। वह प्रत्येक पंक्ति के साधनों का वेक्टर देगा। उनके आदेश को अद्वितीय स्तंभ नामों के प्रत्येक समूह के लिए पंक्ति का अर्थ मिलता है और वही था जो मैं लिखने जा रहा था। आपके नमूना डेटा के साथ उसके आदेश का परिणाम दो सूचियां है।

पंक्तियां भी बहुत तेज हैं।

इसे नीचे तोड़ने के लिए, अपनी स्मृति के सभी कॉलम के माध्यम प्राप्त करने का एकमात्र बस

rowMeans(df[,colnames(df) == 'Memory']) #or from you example, rowMeans(df[,1:5]) 

यह सबसे सरल पूरा सही जवाब है, उसे वोट और यदि आप इसे पसंद उसे सही निशान है।

(Btw, मैं भी जो की लंबे समय से डेटा के रूप में आम तौर पर चीजों को रखने के लिए सिफारिश पसंद आया।)

0
m = matrix(1:12,3) 
colnames(m) = c(1,1,2,2) 

m 

    1 1 2 2 
[1,] 1 4 7 10 
[2,] 2 5 8 11 
[3,] 3 6 9 12 

mt = t(m) 
sapply(by(mt,rownames(mt),colMeans),identity) 

    1 2 
V1 2.5 8.5 
V2 3.5 9.5 
V3 4.5 10.5 
+0

क्या आप एक स्पष्टीकरण प्रदान कर सकते हैं? –