Domanda

Nota: Ho cambiato l'esempio da quando ho postato. Il mio primo esempio è stato troppo semplificato per catturare il vero problema.

Ho due frame di dati che vengono selezionate in modo diverso in una colonna. Voglio corrispondere una colonna e quindi unire il valore dalla seconda colonna. La seconda colonna deve rimanere nello stesso ordine.

Così ho questo:

state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)

s1
s2

che restituisce questo:

> s1
  state value1
1    IA      1
2    IA      2
3    IA      3
4    IL      4
5    IL      5
6    IL      6
> s2
  state value2
1    IL      3
2    IL      4
3    IL      5
4    IA      6
5    IA      7
6    IA      8

e voglio che questo:

  state value1 value2
1    IA      1      6
2    IA      2      7
3    IA      3      8
4    IL      4      3
5    IL      5      4
6    IL      6      5

che sto per guidare me stesso stupido cercare di risolvere questo problema. Sembra che dovrebbe essere un semplice problema pedice.

È stato utile?

Soluzione

Ci sono diversi modi per fare questo (è R, dopo tutto), ma credo che la più evidente è la creazione di un indice. Abbiamo bisogno di una funzione che crea un indice sequenziale (a partire da uno e termina con il numero di osservazioni).

seq_len(3) 
> [1] 1 2 3

Ma abbiamo bisogno di calcolare questo indice all'interno di ciascuna variabile di raggruppamento (stato). Per questo siamo in grado di utilizzare la funzione di ave R. Ci vuole un numerico come primo argomento, poi i fattori di raggruppamento, ed infine la funzione da applicare in ogni gruppo.

s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))

(Si noti l'uso di with, che racconta R per cercare le variabili all'interno dell'ambiente / dataframe. Questa è una pratica migliore rispetto all'utilizzo di s1 $ value1, s2 $ value2, ecc.)

Ora possiamo semplicemente unire (join) i due frame di dati (per le variabili presenti nei due frame di dati: Stato e indice).

merge(s1,s2)

che dà

   state index value1 value2
1    IA     1      1      6
2    IA     2      2      7
3    IA     3      3      8
4    IL     1      4      3
5    IL     2      5      4
6    IL     3      6      5

Per far funzionare tutto questo, ci dovrebbe essere lo stesso numero di osservazioni da parte dello Stato in ciascuno dei frame di dati.

[Edit: ha commentato il codice per chiarezza.] [Edit:. Usato seq_len invece di creare una nuova funzione come suggerito da Hadley]

Altri suggerimenti

NOTA: Controllare il quinto commento alla risposta di cui sopra. Soluzione deve essere

s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))

Testato e funzionante.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top