Comment transposer des données du format long au format large ?Je suis un nouvel utilisateur de JMP.
Mes données sont actuellement au format long. En d’autres termes, les sujets disposent chacun de plusieurs lignes de données. Cependant, j'ai besoin que les données soient au format large pour l'analyse de survie - 1 ligne de données par sujet. Lorsque j'essaie d'utiliser Transpose, JMP me dit "Impossible de transposer. Les colonnes de données ont différents types de données". Les variables sont un mélange de variables continues et nominales. Alors, comment suis-je censé faire ça ? J'ai pu convertir un ensemble de données différent de large en long sans difficulté, mais je n'arrive pas à faire l'inverse.
Les données actuelles sont configurées comme ceci (fausses données) :
ID Var1 Var2 Résultat
001 1 1 0
001 1 1 0
001 1 0 1
002 0 1 0
002 0 1 1
003 1 1 0
Je le veux comme ça :
ID Var1_time1 Var2_time1 Var1_time2 Var2_time2.... Résultat_timex
001 1 1 1 1 1
002 0 1 0 1 1
003 1 1 . . 0
Merci!
Re : Comment transposer des données du format long au format large ?Merci, Jeff! Ça a marché!Re : Comment transposer des données du format long au format large ?@ron_horne a la bonne solution mais peut-être que quelques images aideront.
Tableaux -> Fractionner réorganisera les données comme vous le souhaitez, mais cela nécessite une colonne qui identifie les nouvelles colonnes. Dans votre cas, vous souhaitez créer des colonnes pour chaque ligne de l'ID, vous avez donc besoin d'une colonne qui compte les lignes de l'ID.@ron_horne appelé cette colonne Indice .
Vous devrez également vous assurer que vos données sont triées par IDENTIFIANT pour que cela fonctionne.
Voici les données que vous avez présentées dans votre premier message sous la forme d'un tableau de données JMP.

A ces données il faut ajouter le Indice colonne.@ron_horne a utilisé une formule différente pour sa colonne Index mais j'aime quelque chose d'un peu plus simple.

La formule ci-dessus est :
If( :ID != Lag( :ID, 1 ), 1, Lag( :Index, 1 ) + 1)
En prose, cela signifie que si la valeur de l'ID dans la ligne actuelle n'est pas la même que celle de la ligne précédente (c'est-à-dire Décalage ( :ID, 1) ) puis mettez un 1 dans le Indice colonne, sinon prenez la valeur de la Indice colonne de la ligne précédente (c'est-à-dire Décalage (:Index, 1) )
Comme vous pouvez le constater, le Indice La colonne du tableau de données compte désormais les lignes à l'intérieur IDENTIFIANT .

Maintenant nous pouvons utiliser Tableaux-> Diviser pour diviser votre Var1 , Var2 et Résultat colonnes par Indice et regroupez les lignes par IDENTIFIANT .

Cela vous donnera ce tableau de données, qui, je pense, est ce que vous voulez. Il comporte de nouvelles colonnes pour chaque ligne de l'ID et une ligne par ID.

Il serait peut-être plus facile de voir un exemple plus simple dans lequel nous n'avons pas besoin de créer la colonne Diviser par. Voici une vidéo qui le montre.
Faites-moi savoir si j'ai raté le but ou si vous êtes toujours confus.
Re : Comment transposer des données du format long au format large ?Dernière chance,
1) la première commande crée simplement une source de données originale au format long.
2) la deuxième commande introduit un index pour le numéro de l'événement pour chaque ID. le nombre d'événements n'a pas besoin d'être égal pour chaque ID. mais, si certains ID ont moins d'événements, ils auront des valeurs manquantes au format de tableau large.
3) la troisième commande profite des colonnes index et ID afin de diviser la table comme vous l'avez demandé. une colonne pour chaque événement et variable et chaque ligne ne représente qu'un seul identifiant.
sur vos données, il vous suffit d'exécuter les deux dernières commandes.
names default to here(1);
// source data table
dt = New Table( "Long",
Add Rows( 7 ),
New Column( "ID",
Numeric,
Continuous,
Format( "Best", 5 ),
Set Values( [1, 1, 1, 2, 2, 3, 3] )
),
New Column( "Var1",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [1, 1, 1, 0, 0, 1, 1] )
),
New Column( "Var2",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [1, 1, 0, 1, 1, 1, 0] )
),
New Column( "Outcome",
Numeric,
Continuous,
Format( "Best", 12 ),
Set Values( [0, 0, 1, 1, 1, 0, 0] )
)
);
// add index column for spliting - no need to sort the table first
dt << new column ("index", formula(Sum( :ID[Index( 1, Row() )] == :ID ) ) );
// now split by index and group by ID
dt << Split(
Split By( :index ),
Split( :Var1, :Var2, :Outcome ),
Group( :ID ),
Output Table( "Wide" )
);
Re : Comment transposer des données du format long au format large ?Ce code m'a donné 2 tables. Le premier s’appelait « Source » et ne comportait que 10 lignes de données et 5 colonnes. La colonne ID va de 1 à 4 (pas mes identifiants) et l'ID apparaît sur 3 lignes. Je ne sais pas vraiment ce que c'était censé faire. Toutes les données sont binaires, même mes variables de date. Le deuxième tableau « sans titre » comportait 4 lignes de données et 4 colonnes. L'ID va de 1 à 4 dans les lignes et les colonnes sont toutes étiquetées comme manquantes.
Je ne pense pas que cela fasse ce que je veux.
Re : Comment transposer des données du format long au format large ?si vous avez exécuté l'intégralité du script tel quel et que le résultat correspond à ce que vous recherchez, vous pouvez le reproduire sur votre ensemble de données en quelques clics.
1) ajoutez une nouvelle colonne et appelez-la "index".
2) définissez sa formule comme suit : Sum( :ID[Index( 1, Row() )] == :ID )
3) Tabls >> Divisez-le et remplissez-le ainsi.

cliquez sur OK et vous devriez avoir terminé.
Meilleur,
Ron
Re : Comment transposer des données du format long au format large ?OK, je suis nouveau sur JMP et je n'ai jamais utilisé JSL, même si j'ai fait beaucoup de programmation dans SPSS, SAS et quelques autres. Je ne suis pas du tout le script dans cet exemple, en particulier les "valeurs définies". Je pense que le prochain bloc de commandes tente de créer de nouvelles variables d'index à regrouper avant la division.
J'ai créé quelques variables en passant de large à long dans un autre ensemble de données, mais dans ce cas, chaque sujet avait le même nombre d'observations.
Re : Comment transposer des données du format long au format large ?Désolé de ne pas avoir vérifié d'abord.
Essayez ce qui suit
les noms par défaut sont ici ( 1 ) ;
// table de données sources
dt = Nouveau tableau ( "source",
Ajouter des lignes ( dix ) ,
Nouvelle colonne ( "IDENTIFIANT ",
Numérique,
Continu,
Format ( "Meilleur", 5 ) ,
Définir les valeurs ( [ 1 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 4 ] )
) ,
Nouvelle colonne ( "Var1",
Numérique,
Continu,
Format ( "Meilleur", 12 ) ,
Définir les valeurs ( [ 1 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 1 , 0 ] )
) ,
Nouvelle colonne ( "Var2",
Numérique,
Continu,
Format ( "Meilleur", 12 ) ,
Définir les valeurs ( [ 1 , 1 , 0 , 1 , 1 , 1 , 0 , 1 , 1 , 0 ] )
) ,
Nouvelle colonne ( "Résultat",
Numérique,
Continu,
Format ( "Meilleur", 12 ) ,
Définir les valeurs ( [ 0 , 0 , 1 , 1 , 1 , 0 , 0 , 1 , 1 , 1 ] )
)
) ;
// ajoute une colonne d'index pour le fractionnement - pas besoin de trier la table en premier
dt << nouvelle colonne ( "indice", formule ( Somme ( :IDENTIFIANT [ Indice ( 1 , Rangée () )] == :ID ) ) ) ;
// maintenant divisé par index et groupe par ID
dt << Diviser (
Divisé par ( :indice ) ,
Diviser ( :Var1, :Var2, :Résultat ) ,
Groupe ( :IDENTIFIANT )
) ;
Re : Comment transposer des données du format long au format large ?Je ne suis pas sûr de ce qui se passe alors. Les données sont triées par ID. Lorsque je divise par ID et que j'utilise mes variables comme "colonnes divisées", je me retrouve avec 14 lignes de données et une colonne pour chaque combinaison identifiant/variable.
J'essaie d'obtenir :
ID visite1 visite 2 .... visite13 résultat1 résultat2 ... résultat 13
001 13/09 20/10 ... 3/2 0 0 ... 1
002 7/04 8/12 ... 12/5 0 1 ... 1
Ce que j'obtiens, c'est
Date1-ID001 Date1-ID002
Ligne1 13/09 04/07
Ligne2 20/10 12/8
Merci,
Joe
Re : Comment transposer des données du format long au format large ?
Oups..... Je pense que vous pouvez résoudre le problème si vous utilisez le groupe et y placez également votre colonne d'identification.
Si vos données sont triées par ID, (toutes les données d'un ID donné sont ensemble). S'ils ne sont pas triés, accédez à Tables==>Tri et classez les données par ID. Ensuite, en le sélectionnant comme colonne "Split By", et votre Var1, Var2, Outcome comme "Split Columns", vous obtiendrez un tableau de données avec une ligne par valeur de la colonne Split By, puis vous obtiendrez Var1 001, Var1 002. ......Var1 013, Var2 001, Var2 002.......Var2 013, Résultat 001, Résultat 002......Résultat 013.
Étant donné que vous pouvez avoir jusqu'à 13 niveaux.
Re : Comment transposer des données du format long au format large ?Merci, Ron, mais je ne fais pas de simples résumés. Je travaille sur une analyse de survie. Ma première étape consiste à convertir les données en grand format.
JoeRe : Comment transposer des données du format long au format large ?Merci, Jim. Cela a en partie fonctionné. Cependant, au lieu d'obtenir une ligne pour chaque ID d'objet (n = 15 000), je me suis retrouvé avec 14 lignes de données et chaque nom de variable est accompagné du SubjectID.
Mes données sont organisées SubjectID. Dans ce cadre, les sujets peuvent disposer de plusieurs lignes de données (codes de traitement) pour chaque visite. Au format long, il y a 1 à 13 lignes de données par sujet.
Faut-il utiliser plusieurs variables « divisées par » ? Faut-il utiliser « regrouper par » ?
Merci,
Joe
Re : Comment transposer des données du format long au format large ?Jim a raison. Pourtant, si vous faites cela uniquement pour produire des résumés des données par ID, vous pouvez enregistrer cette étape en utilisant Tableaux >>> résumé.
meilleur,
Ron
Re : Comment transposer des données du format long au format large ?Ce que vous voulez faire, c'est utiliser
Tableaux ==> Diviser
Vous pouvez diviser par ID et spécifier var1, var2 et le résultat comme colonnes divisées.Ré: Comment transposer des données du format long au format large ?Je sais que c'est un vieux fil de discussion, mais j'ai une question. Cela a fonctionné pour moi, sauf que lorsque j'essaie de créer la colonne d'index, elle est vide pour le premier ID. Voici à quoi cela ressemble.
Est-ce que quelqu'un sait ce qui pourrait causer cela ?

Ré: Comment transposer des données du format long au format large ?Voici une approche pour obtenir ce que vous voulez
If( Row() == 1,
theVal = 1,
If( Lag( :yourColumn ) != :yourColumn,
theVal
++)
);
theVal;
Ré: Comment transposer des données du format long au format large ?Salut,
Où dois-je placer cette formule ? Dans la même colonne d'index ? Dois-je remplacer « votre colonne » par quelque chose ?
Ré: Comment transposer des données du format long au format large ?La formule que j’ai spécifiée serait placée dans la colonne Index.
« yourColumn » doit être remplacé par le nom de la colonne que vous souhaitez incrémenter la valeur de la colonne d'index lorsque la colonne est modifiée.