2017-09-18 6 views
1

Ich habe einen Datensatz in r mit zwei Spalten mit numerischen Daten und einem mit einem Bezeichner. Einige der Zeilen teilen sich die gleiche Kennung (d. H. Sie sind die gleiche Person), enthalten jedoch unterschiedliche Daten. Ich möchte den Bezeichner verwenden, um diejenigen, die einen Bezeichner aus einer Zeile teilen, in eine Spalte zu verschieben. Es gibt derzeit 600 Zeilen, aber es sollte 400 sein.Verschieben von Zeilen zu Spalten in R mit ID

Kann jemand R Code teilen, der dies tun könnte? Ich bin neu bei R und habe das Umform (cast) Programm ausprobiert, aber ich kann es nicht wirklich nachvollziehen und bin mir nicht sicher, ob es genau das ist, was ich versuche.

Jede Hilfe dankbar geschätzt.

UPDATE:

Aktuelle

ID Age Sex 
1 3 1 
1 5 1 
1 6 1 
1 7 1 
2 1 2 
2 12 2 
2 5 2 
3 3 1 

Erwartete Ausgabe

ID Age Sex Age2 Sex2 Age3 Sex3 Age4 Sex4 
1 3 1 5 1  6 1 7 1 
2 1 2 12 2  5 2 
3 3 1 

UPDATE 2:

Bisher habe ich versucht, die Schmelze mit und dcast Befehle von reshape2. Ich komme dorthin, aber es sieht immer noch nicht ganz richtig aus. Hier ist mein Code:

x <- melt(example, id.vars = "ID") 

x$time <- ave(x$ID, x$ID, FUN = seq_along) 

example2 <- dcast (x, ID ~ time, value.var = "value") 

und hier ist die Ausgabe, die Code verwendet:

ID A B C D  E F G H (for clarity i have labelled these) 
1 3 5 6 7  1 1 1 1 
2 1 12 5 2  2 2 
3 3 1 

So, wie Sie wahrscheinlich sehen können, es ist das Verwechseln von den ‚Geschlecht‘ und ‚Alter‘ Variablen und Kombinieren sie in der gleichen Spalte. Zum Beispiel hat Spalte D den Wert '7' für Person 1 (Alter 4), aber '2' für Person 2 (Geschlecht). Ich kann sehen, dass mein Code nicht angibt, wo die numerischen Werte umgewandelt werden sollen, aber ich weiß nicht, wie ich diesen Teil programmieren soll. Irgendwelche Ideen?

+0

zeigen Sie ein kleines reproduzierbares Beispiel und erwartete Ausgabe auf der Grundlage dieser – akrun

+1

Bitte 'edit' Ihrer Post und aktualisiert es – akrun

+0

wäre hilfreich zu zeigen, was Sie versucht haben, was mit diesem Versuch schief gelaufen ist, was Sie sonst noch versucht haben. SO ist kein Platz für andere, nur Code für Sie zu schreiben – workabyte

Antwort

1

Hier ist ein Ansatz mit gather, spread und unite vom tidyr Paket:

suppressPackageStartupMessages(library(tidyverse)) 
x <- tribble(
    ~ID, ~Age, ~Sex, 
    1, 3, 1, 
    1, 5, 1, 
    1, 6, 1, 
    1, 7, 1, 
    2, 1, 2, 
    2, 12, 2, 
    2, 5, 2, 
    3, 3, 1 
) 

x %>% group_by(ID) %>% 
    mutate(grp = 1:n()) %>% 
    gather(var, val, -ID, -grp) %>% 
    unite("var_grp", var, grp, sep ='') %>% 
    spread(var_grp, val, fill = '') 
#> # A tibble: 3 x 9 
#> # Groups: ID [3] 
#>  ID Age1 Age2 Age3 Age4 Sex1 Sex2 Sex3 Sex4 
#> * <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
#> 1  1  3  5  6  7  1  1  1  1 
#> 2  2  1 12  5   2  2  2  
#> 3  3  3      1 

Wenn Sie die Spalten numerisch halten bevorzugen, dann entfernen Sie einfach das fill='' Argument von spread(var_grp, val, fill = '').

Andere Fragen, die dabei helfen können, zählen:

R spreading multiple columns with tidyr

How can I spread repeated measures of multiple variables into wide format?

+0

Vielen Dank für Ihre Hilfe - das hat für dieses spezielle Problem funktioniert. Ich werde jetzt versuchen, es auf meinen realen Datensatz anzuwenden. – abbg662

Verwandte Themen