2017-10-18 5 views
-2

Je convertis en R à partir de STATA. Une chose que j'ai du mal à reproduire correctement est la fonction de refonte dans STATA. Dans STATA à peu près ceci peut être fait avec:Remodeler plusieurs copies d'un ensemble de colonnes dans R à la fois Wide> Long et Long> Wide

reshape wide variable names, i(Unique person ID) j(ID identifying each entry per unique ID i) 

je un ensemble de données contenant des lignes intra-veineux utilisés par les patients (échantillon maintenant attaché) .Procédé de données est actuellement la ligne longue (1 row per). Pour chaque ligne, vous verrez qu'il y a plusieurs colonnes; type de ligne, date d'insertion, date de suppression, etc.

Je souhaiterais savoir comment redéfinir la mise en page 1 en largeur et la mise en page 2 en arrière. Chaque patient a un identifiant unique. Je peux étiqueter chaque rangée par personne avec un identifiant unique (c'est-à-dire des rangées de numéros dans ID_Var 1: n). Exemple de disposition large/longue souhaitée ci-dessous.

Theoretical Long and Wide Dataset layout

Cela se sent différent des exemples de Remodeler je l'ai vu sur Stackoverflow (et qui sont décrits dans le antisèche de dplyr) - parce que normalement ils seraient remodelant en fonction de dire la valeur dans la colonne de ligne - et vous ferait une nouvelle colonne appelée périphérique et prendrait la valeur d'inséré et la mettrait dans la colonne périphérique, et faisant une autre colonne appelée Hickman, et mettant la valeur insérée dans cette colonne, etc Exemple DPLYR typique (pas le but ici)

DPLYR type examples

Je suis heureux pour une solution de base ou dplyr (ou en fait alternative) .... J'ai essayé d'utiliser reshape dans R :: base et ai jeté un coup d'oeil à la propagation dans dplyr mais n'ai pas réussi à travailler? parce que j'essaye de tout faire en 1 pas (ce que je ferais dans STATA).

Par exemple, j'essayé

lines_wide <- reshape(lines,idvar=lines$Episode,timevar=lines$n,direction="wide")

Mais je reçois: Erreur dans [.data.frame (données,, varID): colonnes non définies sélectionnées

J'ai essayé aussi spécifier des éléments spécifiques à remodeler en utilisant v. noms:

lines_wide <- reshape(lines,idvar=lines$Episode,timevar=lines$n,direction="wide", v.names = list(lines$Site,lines$Line.Type,lines$Removal.Reason)) 

Mais j'obtiens la même erreur.

Un exemple du long jeu de données est ici: https://www.dropbox.com/s/h0lo910ix304qj3/reshape_example.xlsx?dl=0

+4

Il est plus probable que nous serons en mesure de vous aider si vous fournissez e a [exemple complet minimal reproductible] (http://stackoverflow.com/help/mcve) pour accompagner votre question. Quelque chose que nous pouvons travailler et utiliser pour vous montrer comment il pourrait être possible de répondre à votre question, je vous recommande également de jeter un oeil à la [_comment je pose une bonne question_] (https://stackoverflow.com/help/how -demander). Il est également généralement bon de démontrer que vous avez déjà fait des efforts pour y arriver. –

+0

Excuses - J'ai ajouté un lien vers une copie de quelques exemples de données et quelques exemples de ce que j'ai essayé d'utiliser la commande base: reshape. – mmarks

Répondre

2

Vous devriez vraiment fournir au moins vos données ... De toute façon, ici un tidyverse -solution, en utilisant tidyr et dplyr:

library(tidyverse) 

df <- tribble(~patient, ~line, ~inserted, ~complications, 
      1,"peripheral", "01/02/17", "none", 
      1,"peripheral", "04/02/17", "blocked") 

# this prefix preserves the order of your variables: 
names(df)[-1] <- c("[1]line", "[2]inserted", "[3]complications") 

df_wide <- 
    df %>% 
    group_by(patient) %>% 
    mutate(nr = seq_len(n())) %>% # number of observations for each patient 
    gather(key = key, value = value, -patient, -nr) %>% # make Long 
    arrange(nr, key) %>% # sort by nr and variable name to keep you order 
    unite(key, nr, key, sep = ".") %>% # paste variable number and variable name 
    mutate(key = factor(key, levels = unique(key))) %>% # tells spread to preserve order 
    spread(key = key, value = value) # make wide again 

# remove the prefix from above 
names(df_wide) <- names(df_wide) %>% 
       gsub(pattern = "\\[\\d{1}\\]", 
       replacement = "") 

df_wide 

    patient `1.line` `1.inserted` `1.complications` `2.line` `2.inserted` `2.complications` 
* <dbl>  <chr>  <chr>    <chr>  <chr>  <chr>    <chr> 
1  1 peripheral  01/02/17    none peripheral  04/02/17   blocked 

Et l'inverse:

df_long <- 
    df_wide %>% 
    gather(key = key, value = value, -patient) %>% 
    separate(key, into = c("nr", "key")) %>% 
    spread(key = key, value = value) %>% 
    select(patient, line, inserted, complications) 

df_long 

    patient  line inserted complications 
* <dbl>  <chr> <chr>   <chr> 
1  1 peripheral 01/02/17   none 
2  1 peripheral 04/02/17  blocked 
+1

Edit: Placé 'arrange' avant' unite', juste pour permettre l'ordre correct si 10 lignes ou plus par patient se produisent. Également ajouté l'exemple à transformer en trame de données initiale. – Tino