2017-05-16 6 views
2

On suppose, j'ai une trame de données comme ci-dessous
DF1:Comment utiliser la propagation() pour obtenir souhaitée sortie

+------+--+------+--------+ 
| ID | | Type | Points | 
+------+--+------+--------+ 
| DJ45 | | A | 69.2 | 
| DJ45 | | F | 60.8 | 
| DJ45 | | C | 2.9 | 
| DJ46 | | B | 22.7 | 
| DJ46 | | D | 18.7 | 
| DJ46 | | A | 16.1 | 
| DJ47 | | E | 67.2 | 
| DJ47 | | C | 63.1 | 
| DJ47 | | F | 16.7 | 
| DJ48 | | D | 8.4 | 
+------+--+------+------+ 

Je veux obtenir un résultat qui fournira le Top valeur 2 (point sage) de saisir ci-dessous le format:

sortie:

+------+---------+---------+ 
| ID | Type1 | Type2 | 
+------+---------+---------+ 
| DJ45 | A  | F  | 
| DJ46 | B  | D  | 
| DJ47 | E  | C  | 
| DJ48 | D  | NA  | 

Je l'ai utilisé:

df1 %>% 
    group_by(Id) %>% 
    top_n(2,wt=Points) %>% 
    mutate(val = paste("Type", row_number())) %>% 
    filter(row_number()<=2) %>% 
    select(-Points) %>% 
    spread(val, Type) 

mais je reçois la réponse suivante:

sortie:

+------+------+--------+---------+ 
| ID |Points|Type1 | Type2 | 
+------+------+--------+---------+ 
| DJ45 | 69.2 | A  | NA  | 
| DJ45 | 60.8 | NA | F  | 
| DJ46 | 22.7 | B  | NA  | 
| DJ46 | 18.7 | NA | D  | 
| DJ47 | 67.2 | E  | NA  | 
| DJ47 | 63.1 | NA | C  | 
| DJ48 | 8.4 | D  | NA  | 
+0

Veuillez fournir un exemple reproductible que nous pouvons copier/coller dans nos sessions. –

+0

Veuillez utiliser 'dput (df1)' pour fournir les données dans un format facile à utiliser. –

+0

Votre code ne correspond pas à votre résultat. 'select (-Points)' ne devrait pas retourner un fichier data.frame qui contiendra toujours 'Points' (ce qui explique pourquoi ce n'est pas' spread'ing). – alistaire

Répondre

2
df <- read.table(header = T, stringsAsFactors = F, text = " 
ID Type Points 
DJ45 A 69.2 
DJ45 F 60.8 
DJ45 C 2.9 
DJ46 B 22.7 
DJ46 D 18.7 
DJ46 A 16.1 
DJ47 E 67.2 
DJ47 C 63.1 
DJ47 F 16.7 
DJ48 D 8.4 
") 

library(dplyr) 
library(tidyr) 

df %>% 
    group_by(ID) %>% 
    top_n(2, wt = Points) %>% 
    arrange(-Points) %>% 
    mutate(Points = paste0('Type', row_number())) %>% 
    spread(Points, Type) 
  • top_n(2, wt = Points) filtre les deux premières lignes, selon Points, au sein du groupe ID
  • arrange(-Points) commandes par ordre décroissant
  • mutate(Points = paste0('Type', row_number())) modifie Points être égal à « Type » + le numéro de ligne au sein du groupe ID (1 à 2)
  • spread(Points, Type) fait colonnes pour chaque valeur unique dans Points et place la valeur appropriée de Type dans les
+0

Ajoutez une petite description pour expliquer pourquoi cela fonctionne. – Morgoth

+0

J'ai corrigé un bug ... 'top_n' n'ordonne pas les lignes comme je le pensais, donc vous devez utiliser' arrange' pour commander en descendant 'Points'. –