2015-07-07 13 views
5

ho un frame di dati in questo modoRiorganizzare colonne cornice dati a R (mutare, dplyr)

Type Number Species 
A  1   G  
A  2   R 
A  7   Q 
A  4   L 
B  4   S 
B  5   T 
B  3   H 
B  9   P 
C  12  K 
C  11  T 
C  6   U 
C  5   Q 

Dove ho usato group_by (Type) mio obiettivo è quello di comprimere questi dati avendo NUMERO sia all'inizio 2 valori nella colonna del numero e quindi creazione di una nuova colonna (Number_2) che corrisponde ai secondi 2 valori. Inoltre vorrei i valori Specie per i due numeri inferiori da eliminare, in modo che la specie corrisponde al numero più alto nella riga vorrei utilizzare dplyr e la finale sarà simile a questa

Type Number Number_2 Species  
A  7 1    Q 
A  4 2    L 
B  5 3    T 
B  9 4    P 
C  12 6    K 
C  11 5    T 

a partire da ora l'ordine in cui è inserito number_2 non importa, purché sia ​​dello stesso tipo .... Non so se è possibile, ma se lo è qualcuno sa come ...

grazie!

+0

Sto pensando di esso – user4999605

+0

dispiace, volevo dire cambiare i dati per conto mio, non su questa domanda! – user4999605

+0

Se la soluzione di seguito funziona, considera di accettare la soluzione – akrun

risposta

7

Si può provare

library(data.table) 
setDT(df1)[order(-Number), list(Number1=Number[1:2], 
           Number2=Number[3:4], 
           Species=Species[1:2]), keyby = Type] 
# Type Number1 Number2 Species 
#1: A  7  2  Q 
#2: A  4  1  L 
#3: B  9  4  P 
#4: B  5  3  T 
#5: C  12  6  K 
#6: C  11  5  T 

o utilizzando dplyr con do

library(dplyr) 
df1 %>% 
    group_by(Type) %>% 
    arrange(desc(Number)) %>% 
    do(data.frame(Type=.$Type[1L], 
       Number1=.$Number[1:2], 
       Number2 = .$Number[3:4], 
       Species=.$Species[1:2], stringsAsFactors=FALSE)) 
# Type Number1 Number2 Species 
#1 A  7  2  Q 
#2 A  4  1  L 
#3 B  9  4  P 
#4 B  5  3  T 
#5 C  12  6  K 
#6 C  11  5  T 
+0

Ho aggiunto una modifica al mio post, potresti dargli un'altra occhiata - Grazie! – user4999605

+2

Ero nel mezzo di pubblicare la stessa cosa che non penso che questo possa essere fatto semplicemente con 'dplyr'. Come nota a margine, non è necessario '[order (Type)]', basta usare 'keyby' invece di' by' –

+0

grazie! Non ho bisogno di usare necessariamente dplyr, quindi è ok – user4999605

2

Ecco un approccio dplyr diverso.

library(dplyr) 

# Start creating the data set with top 2 values and store as df1: 
df1 <- df %>% 
    group_by(Type) %>% 
    top_n(2, Number) %>% 
    ungroup() %>% 
    arrange(Type, Number) 

# Then, get the anti-joined data (the not top 2 values), arrange, rename and select 
# the number colummn and cbind to df1: 
out <- df %>% 
    anti_join(df1, c("Type","Number")) %>% 
    arrange(Type, Number) %>% 
    select(Number2 = Number) %>% 
    cbind(df1, .) 

Questo si traduce in:

> out 
# Type Number Species Number2 
#1 A  4  L  1 
#2 A  7  Q  2 
#3 B  5  T  3 
#4 B  9  P  4 
#5 C  11  T  5 
#6 C  12  K  6 
2

Questa potrebbe essere un'altra opzione utilizzando ddply

library(plyr) 
ddply(dat[order(Number)], .(Type), summarize, 
     Number1 = Number[4:3], Number2 = Number[2:1], Species = Species[4:3]) 

# Type Number1 Number2 Species 
#1 A  7  2  Q 
#2 A  4  1  L 
#3 B  9  4  P 
#4 B  5  3  T 
#5 C  12  6  K 
#6 C  11  5  T 
Problemi correlati