2014-05-06 9 views
5

si supponga di avere le seguenti due data.frames:dplyr group_by e riassumere per due DF con nome stessa colonna

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

(notare che sia DFS hanno una colonna denominata "x")

e voi vuole riassumere le somme di DF2 $ z per i gruppi di "x" in df1 come questo:

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

questo restituisce un errore "non valido indextype integer" (tradotto).

Ma quando cambio il nome di colonna "x" in uno qualsiasi dei due DFS, funziona:

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 

Posso immaginare molte situazioni, dove si hanno due DFS con lo stesso nome della colonna (come una colonna "ID" per la quale questo potrebbe essere un problema, a meno che non ci sia un modo semplice per aggirarlo.

Mi sono perso qualcosa? Ci possono essere altri modi per ottenere lo stesso risultato per questo esempio, ma sono interessato a capire se ciò è possibile in dplyr (o forse perché no).

(i due DFS dont necessariamente bisogno di avere gli stessi "x" valori unici come in questo esempio)

+0

@Arun potresti dimostrare come funzionerebbe nell'esempio? –

+0

@Arun, grazie per aver risposto con un esempio. questa sembra essere una buona soluzione con un approccio diverso. Mi chiedo se potrebbero esserci altri casi (forse più complicati nella funzione di riepilogo) in cui potrebbe essere ancora molto utile usare l'approccio come indicato nella mia domanda (ma al momento non riesco a trovare un buon esempio) –

+0

fatto (https://github.com/hadley/dplyr/issues/417) –

risposta

2

seguito il commento da @ beginneR, immagino che sarebbe qualcosa di simile:

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

si può provare:

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

hth

Problemi correlati