2016-06-10 9 views
2

Ich habe ein Datenrahmen, der wie folgtR: Konvertieren Sie mehrere Spalten in einzelne Spalte

+---------+--------+--------+--------+-------+ 
| ID | week1_t| week1_a| week2_t|week2_a| 
+---------+--------+--------+--------+-------+ 
| 1 | 12  | 22  | 17 | 4 | 
| 1 | 15  | 32  | 18 | 5 | 
| 1 | 24  | 12  | 29 | 6 | 
| 2 | 45  | 11  | 19 | 8 | 
| 2 | 23  | 33  | 20 | 10 | 
+---------+--------+--------+--------+-------+ 

Es sind 48 Spalten (Woche 1-24) sieht mit „t“ und „a“ Suffixen. Ich möchte wie diese all Woche Spalten in einen einzigen „Woche“ -Spalte konsolidieren:

+---------+--------+--------+-------- 
| ID | week | t  | a | 
+---------+--------+--------+-------- 
| 1 | 1  | 22  | 17 | 
| 1 | 2  | 32  | 18 | 
| 1 | 3  | 12  | 19 | 
| 1 | 5  | 33  | 20 | 
+---------+--------+--------+------- 

Wie gehe ich über diese Transformation in R zu machen? Ich kann mir keine Möglichkeit vorstellen, dies außerhalb von mehreren if-Anweisungen und for-Schleifen zu tun.

Daten

dd <- read.table(header = TRUE, text = "ID week1_t week1_a week2_t week2_a 
    1  12  22  17  4 
    1  15  32  18  5 
    1  24  12  29  6 
    2  45  11  19  8 
    2  23  33  20  10") 
+0

Paket dplyr alle Funktionen, die Sie benötigen hat. Hier ist ein praktischer Spickzettel: https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf –

+1

Bitte zeigen Sie, was Sie versucht haben. und verwende dieses Tabellenformat nicht. – rawr

+4

'reshape (dd, dir = 'lang', variierend = lapply (c ('t', 'a'), grep, namen (dd)), timevar = 'woche')' – rawr

Antwort

2

Sie data.tablemelt verwenden können:

library(data.table) 
setDT(dd) 
melt(dd, id = 1, measure=patterns("_t$", "_a$"), value.name = c("t", "a"), 
    variable.name = "week") 

    ID week t a 
1: 1 1 12 22 
2: 1 1 15 32 
3: 1 1 24 12 
4: 2 1 45 11 
5: 2 1 23 33 
6: 1 2 17 4 
7: 1 2 18 5 
8: 1 2 29 6 
9: 2 2 19 8 
10: 2 2 20 10 

Wie Sie aus ?melt lesen:

measure.vars auch jetzt akzeptiert eine Liste von Zeichen/integer Vektoren zu schmelzen in mehrere Spalten - dh schmelzen in mehr als ein Wert Spalten gleichzeitig. Verwenden Sie die Funktionsmuster, um mehrere Muster bequem bereitzustellen. Siehe Abschnitt Beispiele

+0

Ich kann nicht glauben, dass es das war einfach... – Parseltongue

0

Mit tidyr/dplyr:

library(dplyr) 
library(tidyr) 

     # add row index so later spreading indexed correctly 
dd %>% add_rownames() %>% 
    # melt to long format 
    gather(week, value, -ID, -rowname) %>% 
    # separate week number from variable suffix 
    separate(week, c('week', 'var')) %>% 
    # reduce week number to actual number 
    mutate(week = extract_numeric(week)) %>% 
    # spread a and t values back to wide form 
    spread(var, value) %>% 
    # clean up 
    select(-rowname) 

# Source: local data frame [10 x 4] 
# 
#  ID week  a  t 
# (int) (dbl) (int) (int) 
# 1  1  1 22 12 
# 2  1  2  4 17 
# 3  1  1 32 15 
# 4  1  2  5 18 
# 5  1  1 12 24 
# 6  1  2  6 29 
# 7  2  1 11 45 
# 8  2  2  8 19 
# 9  2  1 33 23 
# 10  2  2 10 20 
Verwandte Themen