2017-10-06 3 views
0

Edit: Dies ist eine ähnliche Frage zu this one, aber ich bin explizit nach einem tidyr/dplyr Ansatz.R/tidyr/dplyr - wiederholte Zeilen nach Schlüssel in Spalten mit neuen Variablennamen

Ich bin gespannt, ob es eine nette "tidyr/dplyr" -Methode gibt, diese Art der Transponierung zu machen?

Ich habe verschiedene (nach ID) Beobachtungen (v2, v2, v3) des gleichen Phänomens (Schlüssel) derzeit im "langen" Format, und für die Präsentation möchte ich ein breites Format mit einem Phänomen (Schlüssel) pro Reihe, aber jeder Satz von Beobachtungen (ID, v1, v2, v3) in wiederholten Sätzen von Spalten mit entsprechend inkrementierten Variablennamen

In diesem Fall weiß ich, dass es nur 2 IDs geben wird, also ich teilen Sie es in zwei Rahmen von Tabellen und verband sie.

Ich möchte alle Hinweise auf eine allgemeine tidyr Art und Weise des Drehens:

key ID  v1  v2  v3 
32 blue 8.550 0.782 78.281 
32 green 9.200 1.680 95.354 
22 orange 6.100 -0.143 44.320 
22 pink 6.500 0.672 74.920 
100 green 4.500 -0.460 32.280 
100 blue 8.000 0.506 69.372 

In:

key IDa  v1  v2  v3  IDb  v1b  v2b  v3b 
32 blue 8.550 0.782 78.281 green 9.200 1.680 95.354 
22 orange 6.100 -0.143 44.320 pink 6.500 0.672 74.920 
100 green 4.500 -0.460 32.280 blue 8.000 0.506 69.372 

Dank!

Antwort

2

Sie können erstellen eine id Spalte für jeden Schlüssel und dann data.table::dcast verwenden, die mehrere Spalten schwenken kann:

df %>% 
    group_by(key) %>% 
    mutate(n = row_number()) %>% 
    {data.table::dcast(data = setDT(.), key ~ n, value.var = c('ID', 'v1', 'v2', 'v3'))} 

# key ID_1 ID_2 v1_1 v1_2 v2_1 v2_2 v3_1 v3_2 
#1: 22 orange pink 6.10 6.5 -0.143 0.672 44.320 74.920 
#2: 32 blue green 8.55 9.2 0.782 1.680 78.281 95.354 
#3: 100 green blue 4.50 8.0 -0.460 0.506 32.280 69.372 
+0

war nicht gekommen, über data.table/dcast vor - sehr nützlich! Ich habe diese als "beantwortet" markiert, da es eine kompaktere Lösung ist als die untenstehende, da ich anfangs festgestellt habe, dass diese einfacher zu befolgen ist. – Bantamug

0

eine Basis R Lösung in Betracht mit merge der umgekehrte doppelte verbinden mit (a ausgeliehene SQL-Methode). Sie müssen jedoch eine Helperspalte für die Zeilennummer für das umgekehrte Duplikat subset erstellen und eindeutige IDa Werte angeben. Unter transform wird verwendet, um die Helfer Zeile Spalten zu entfernen.

txt = "key ID  v1  v2  v3 
32 blue 8.550 0.782 78.281 
32 green 9.200 1.680 95.354 
22 orange 6.100 -0.143 44.320 
22 pink 6.500 0.672 74.920 
100 green 4.500 -0.460 32.280 
100 blue 8.000 0.506 69.372" 

df <- read.table(text=txt, header=TRUE, stringsAsFactors = FALSE) 
df$row <- row.names(df) 

mdf <- transform(subset(merge(df, df, by="key", suffixes=c("a", "b")), rowa < rowb), rowa=NULL, rowb=NULL) 

mdf 
# key IDa v1a v2a v3a IDb v1b v2b v3b 
# 2 22 orange 6.10 -0.143 44.320 pink 6.5 0.672 74.920 
# 6 32 blue 8.55 0.782 78.281 green 9.2 1.680 95.354 
# 10 100 green 4.50 -0.460 32.280 blue 8.0 0.506 69.372 
2

Diese Lösung beruht auf tidyr und dplyr nur. Der Schlüssel hier ist, tidyr::unite zu verwenden, um die Schlüsselvariable zu spread mit zu erstellen.

library(dplyr) 
library(tidyr) 

df %>% 
    group_by(key) %>% 
    mutate(suffix = letters[1:n()]) %>% 
    gather(var, val, -c(key, suffix)) %>% 
    unite(var_group, var, suffix, sep = "") %>% 
    spread(var_group, val) %>% 
    select(key, ends_with("a"), ends_with("b")) 
#> # A tibble: 3 x 9 
#> # Groups: key [3] 
#>  key IDa v1a v2a v3a IDb v1b v2b v3b 
#> * <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 
#> 1 22 orange 6.1 -0.143 44.32 pink 6.5 0.672 74.92 
#> 2 32 blue 8.55 0.782 78.281 green 9.2 1.68 95.354 
#> 3 100 green 4.5 -0.46 32.28 blue  8 0.506 69.372 
Verwandte Themen