2014-05-06 9 views
5

मान लीजिए आप निम्न दो data.frames है:dplyr group_by और उसी स्तंभ नाम के साथ दो df के लिए संक्षेप में प्रस्तुत

set.seed(1) 
x <- letters[1:10] 
df1 <- data.frame(x) 
z <- rnorm(20,100,10) 
df2 <- data.frame(x,z) 

(ध्यान दें कि दोनों DFS एक कॉलम "एक्स" का नाम है)

और आप DF1 में इस तरह के "x" समूहों के लिए df2 $ जेड की रकम को संक्षेप में प्रस्तुत करना चाहते हैं:

df1 %.% 
    group_by(x) %.% 
    summarize(
    z = sum(df2$z[df2$x == x]) 
    ) 

यह एक त्रुटि "अवैध indextype पूर्णांक" रिटर्न (अनुवाद)।

लेकिन जब मैं दो DFS में से किसी एक में से स्तंभ "x" नाम बदलते हैं, यह काम करता है:

df2 <- data.frame(x1 = x,z) #column is now named "x1", it would also work if the name was changed in df1 

df1 %.% 
    group_by(x) %.% 
    summarize(
    z = sum(df2$z[df2$x1 == x]) 
    ) 

# x  z 
#1 a 208.8533 
#2 b 205.7349 
#3 c 185.4313 
#4 d 193.8058 
#5 e 214.5444 
#6 f 191.3460 
#7 g 204.7124 
#8 h 216.8216 
#9 i 213.9700 
#10 j 202.8851 

मैं कई स्थितियों में, जहाँ आप एक ही स्तंभ नाम के साथ दो DFS है कल्पना कर सकते हैं (एक "आईडी" कॉलम की तरह) जिसके लिए यह एक समस्या हो सकती है, जब तक कि इसके चारों ओर एक आसान तरीका न हो।

क्या मुझे कुछ याद आया? इस उदाहरण के लिए एक ही परिणाम प्राप्त करने के अन्य तरीके हो सकते हैं लेकिन मुझे यह समझने में दिलचस्पी है कि क्या यह dplyr (या शायद क्यों नहीं) में संभव है।

(दो DFS जरूरी न ही अद्वितीय "x" इस उदाहरण में मूल्यों की आवश्यकता है)

+0

@ अरुण क्या आप दिखा सकते हैं कि यह उदाहरण में कैसे काम करेगा? उदाहरण के साथ उत्तर देने के लिए –

+0

@ अरुण धन्यवाद। यह एक अलग दृष्टिकोण के साथ एक अच्छा समाधान प्रतीत होता है। मुझे आश्चर्य है कि क्या अन्य मामले हो सकते हैं (सारांश सारांश में शायद अधिक जटिल) जिसमें यह अभी भी मेरे प्रश्न में संकेत के अनुसार दृष्टिकोण का उपयोग करने के लिए बहुत उपयोगी हो सकता है (लेकिन अभी मैं एक अच्छा उदाहरण के साथ नहीं आ सकता) –

+0

किया गया (https://github.com/hadley/dplyr/issues/417) –

उत्तर

2

@ से टिप्पणी के बाद startneR, मुझे लगता है कि यह कुछ ऐसा होगा:

inner_join(df1, df2) %.% group_by(x) %.% summarise(z=sum(z)) 

Joining by: "x" 
Source: local data frame [10 x 2] 

    x  z 
1 a 208.8533 
2 b 205.7349 
3 c 185.4313 
4 d 193.8058 
5 e 214.5444 
6 f 191.3460 
7 g 204.7124 
8 h 216.8216 
9 i 213.9700 
10 j 202.8851 
1

तुम कोशिश कर सकते हैं:

df2%.%filter(x%in%df1$x)%.%group_by(x)%.%summarise(sum(z)) 

hth

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