8
votes

Comment remodeler ce Dataframe avec le paquet de remontage

J'ai un assez grand Dataframe structuré comme ceci: xxx pré>

J'ai besoin de créer un fichier de données comme celui-ci: P>

id   xsource   xvalue   yvalue   zvalue       v 
 1        x1        2       10      200     2.5
 1        x2        4       20      150     2.5
 1        x3        5       15      170     2.5
 2        x1        3       25      300     4.2
 2        x2        7       35      350     4.2
 2        x3        6       40      400     4.2


0 commentaires

5 Réponses :


1
votes

Quelqu'un s'il vous plaît prouver moi vous trompez, mais je ne pense pas qu'il soit facile de résoudre ce problème à l'aide de l'emballage Remonter ou de la base Remoder fonction.

, il est assez facile à l'aide de lapply et do.call :

réplique les données: xxx

Faites l'analyse xxx


2 commentaires

Je suis d'accord que celui-ci est un peu plus compliqué qu'à première vue. Je pense que vous manquez la colonne ID cependant. C'est un problème intéressant et moi-même espérons qu'une solution plus rapide de Néater.


@Tylerinker Merci d'avoir souligné la colonne ID manquante. J'ai édité la réponse pour corriger ceci.



8
votes

Voici la solution Remoape () .

Le bit de clé est que l'argument variable = peut prendre une liste de vecteurs de noms de colonne dans le format large qui correspond aux variables simples au format long. Dans ce cas, les colonnes "x1", "x2", "x3" dans la trame de données d'origine sont envoyées à une colonne de la trame de données longue, colonnes "y1, y2, y2" entrera dans une deuxième colonne, et ainsi de suite. xxx

Enfin, deux étapes purement cosmétiques sont nécessaires pour obtenir les résultats exactement < / em> comme indiqué dans votre question: xxx


2 commentaires

Merci Josh! Toujours un problème. Votre solution fonctionne parfaitement sur cet exemple, mais lorsque je l'applique à mon vrai Dataframe, l'erreur "[.data.frame` (données, variant [[i]] [1L]): Les colonnes non définies sélectionnées" se produisent. Toute suggestion?


Problème résolu! Merci beaucoup, votre solution fonctionne parfaitement!



2
votes

Voici une approche qui utilise reshape2 code> et est décrite en profondeur dans mon document sur Données bien rangées .

Étape 1: Identifiez les variables déjà dans des colonnes. Dans ce cas: ID et v. Ce sont les variables que nous fondons par P> xxx pré>

étape 2: diviser les variables qui sont actuellement combinées dans une colonne. Dans ce cas, la source (la partie de caractère) et le représentant (la partie entière): p>

Il y a beaucoup de façons de le faire, je vais utiliser une extraction de chaîne avec le stringr Code> Package P>

dcast(xm, ... ~ source)

#   id   v rep x  y   z
# 1  1 2.5     1 2 10 200
# 2  1 2.5     2 4 20 150
# 3  1 2.5     3 5 15 170
# 4  2 4.2     1 3 25 300
# 5  2 4.2     2 7 35 350
# 6  2 4.2     3 6 40 400


0 commentaires

0
votes

Essayez d'utiliser le paquet ReshapeGui. Il utilise le package Plyr et le package Reshape2 et vous fournit une interface facile à utiliser qui vous permet de prévisualiser votre remodelage avant de l'exécuter. Cela vous donne également le code pour le remodelage que vous faites pour que vous puissiez la coller dans votre script pour la reproducabilité et vous pouvez ainsi apprendre à utiliser les commandes de la fusion et de la distribution à Remeape2. C'est une belle béquille pour des manipulations de données complexes comme celle-ci pour ceux qui ne sont pas remodelés Ninjas.


0 commentaires

0
votes

Voici deux approches plus récentes qui pourraient intéresser une personne qui lise cette question:

Option 1: Tidyverse P>

library(data.table)
setDT(x)
melt(x, measure.vars = patterns("x", "y", "z"), 
     value.name = c("x", "y", "z"), 
     variable.name = "source")
#    id   v source x  y   z
# 1:  1 2.5      1 2 10 200
# 2:  2 4.2      1 3 25 300
# 3:  1 2.5      2 4 20 150
# 4:  2 4.2      2 7 35 350
# 5:  1 2.5      3 5 15 170
# 6:  2 4.2      3 6 40 400


0 commentaires