-1
votes

R - Fuzzy Rejoignez sur l'entier le plus proche seulement

Supposons que j'ai ce jeu de données pour commencer, dans cette mise en page idiote:

Entrez la description de l'image ici xxx

Je veux que cela ressemble à ceci:

 Entrez la description de l'image ici

Fondamentalement, je veux faire correspondre les rangées de poids, d'âge et de hauteur à la Nommer la ligne au-dessus de lui. Splitting Les données up sont faciles en utilisant dplyr : xxx

à partir d'ici, à l'aide de l'index (numéro de ligne) semble le meilleur moyen, c'est-à-dire correspondre à chaque ligne dans DétailsDF avec l'entrée dans nomsdf qui a l'index le plus proche sans passer. J'ai utilisé le package Fuzzyjoin xxx

Ceci sorte de fonctionne, mais il rejoint également chaque rangée DétailsDF avec chaque ligne dans nomsDF avec un numéro d'index plus petit:

 Entrez la description de l'image ici < P> Je suis proposé une solution à l'aide de la distance à l'index suivant et de filtrer les lignes supplémentaires de cette façon, mais je veux éviter de faire cela; Le fichier source réel sera de plus de 200 000 lignes et le Dataframe de résultat temporaire avec les lignes supplémentaires serait trop gros pour s'adapter à la mémoire. Y a-t-il quelque chose que je puisse faire ici? Merci!


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser

x = which(originalDF$Field == "Name")
originalDF$Name = rep(originalDF$Value[x], times = diff(c(x, NROW(originalDF)+1)))
NewDF = originalDF[originalDF$Field != 'Name', c(4,2,3)]
#    Name  Field Value
# 2  Sara Weight   115
# 3  Sara    Age    17
# 5   Bob Weight   158
# 6   Bob    Age    22
# 7   Bob Height    72
# 9   Irv Weight   210
# 10  Irv    Age    42
# 11  Irv Height    68
# 13 Fred    Age   155
# 14 Fred Height    65


0 commentaires

2
votes

Je recommande de l'approcher d'une manière différente, en gardant une trace de la valeur "nom" la plus récente à chaque point. Remplir () Code> à partir du package TidyR est utile pour cela.

# A tibble: 10 x 6
   Index.x Field.x Value.x Index.y Field.y Value.y
     <int> <fct>   <fct>     <int> <fct>   <fct>  
 1       2 Weight  115           1 Name    Sara   
 2       3 Age     17            1 Name    Sara   
 3       5 Weight  158           4 Name    Bob    
 4       6 Age     22            4 Name    Bob    
 5       7 Height  72            4 Name    Bob    
 6       9 Weight  210           8 Name    Irv    
 7      10 Age     42            8 Name    Irv    
 8      11 Height  68            8 Name    Irv    
 9      13 Age     155          12 Name    Fred   
10      14 Height  65           12 Name    Fred   


1 commentaires

Merci! Je savais qu'il y avait quelque chose de beaucoup plus simple que je négligeais. Et j'ai à peu près des parties mémorisées de Hadley's R pour le livre des sciences de l'information ...



0
votes

Vous pouvez regrouper par cumsum (champ == "nom") . Avec dplyr ... xxx

avec données.Table ... xxx


0 commentaires