Supposons que j'ai ce jeu de données pour commencer, dans cette mise en page idiote:
p> Je veux que cela ressemble à ceci: p> 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 à partir d'ici, à l'aide de l'index (numéro de ligne) semble le meilleur moyen, c'est-à-dire correspondre à chaque ligne dans Ceci sorte de em> fonctionne, mais il rejoint également chaque rangée p> < 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! P> p> dplyr code>: p>
DétailsDF code> avec l'entrée dans
nomsdf code> qui a l'index le plus proche sans passer. J'ai utilisé le package code> Fuzzyjoin le joindo avec p>
DétailsDF code> avec chaque ligne dans
nomsDF code> avec un numéro d'index plus petit: p>
3 Réponses :
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
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
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 ...
Vous pouvez regrouper par avec données.Table ... p> cumsum (champ == "nom") code>. Avec dplyr ...