2016-08-09 146 views
0

ich einen Datenrahmen haben, die wie folgt aussieht:Spalte Reihen, sondern auf gemeinsamen Spaltennamen festhalten

data.frame(group1_a_mu = 10, group1_b_sd = 4, group1_c_xx = 5, group2_a_mu=1, group2_b_sd=2, gorup2_c_xx = 14, stringsAsFactors = FALSE) 

group1_a_mu group1_b_sd group1_c_xx group2_a_mu group2_b_sd gorup2_c_xx 
1  10  4  5  1  2  14 

und ich möchte es so zu transformieren:

  mu sd  xx 
group1  10 4  5 
group2  1  2 14 

wie kann man TU das?

+0

Hinweis, Sie haben einen Tippfehler in Ihrem ursprünglichen Datenrahmen, Sie haben 'gorup2_c = 14', das sollte' group2_c = 14' sein. – steveb

Antwort

1

Sie könnten versuchen, die folgende (auf der Grundlage der Daten aus der ursprünglichen Post):

library(dplyr) 
library(tidyr) 
data.frame(group1_a = 10, group1_b = 4, group1_c = 5, group2_a=1, group2_b=2, group2_c = 14, stringsAsFactors = FALSE) %>% 
    gather(key, val) %>% 
    separate(key, c('group_name', 'subgroup_name'), sep = '_') %>% 
    spread(subgroup_name, val) 

## group_name a b c 
## 1  group1 10 4 5 
## 2  group2 1 2 14 

Für die Situation, wo es 2 _ Zeichen (aktualisiert post), der folgende Ansatz verändert temporär den _ Charakter. Die Alternative besteht darin, den Blick voraus zu verwenden oder hinter Operatoren in dem regulären Ausdruck separate zu suchen (sep).

data.frame(group1_a_mu = 10, group1_b_sd = 4, group1_c_xx = 5, group2_a_mu=1, group2_b_sd=2, group2_c_xx = 14, stringsAsFactors = FALSE) %>% 
    gather(key, val) %>% 
    mutate(key = sub('_', '|', key)) %>%    ## Temporary change of '_' to '|' 
    separate(key, c('group_name', 'subgroup_name'), sep = '_') %>% 
    spread(subgroup_name, val) %>% 
    mutate(group_name = sub('[|]', '_', group_name)) ## Change back to '_' 

## group_name mu sd xx 
## 1 group1_a 10 NA NA 
## 2 group1_b NA 4 NA 
## 3 group1_c NA NA 5 
## 4 group2_a 1 NA NA 
## 5 group2_b NA 2 NA 
## 6 group2_c NA NA 14 

Die Verwendung des positiven Blicks hinter dem Operator führt zu denselben Ergebnissen.

+0

danke steve was, wenn es 2 "_" in den Namen gab? siehe edit – user3022875

+0

Der 'sep' Parameter ist ein regulärer Ausdruck. Es ist wahrscheinlich eine Möglichkeit, dies zu tun, indem Sie den Blick nach vorne oder nach hinten Betreiber (ich bin mir noch nicht sicher, wie das zu tun). Die Alternative besteht darin, das erste '_' vorübergehend in etwas wie' | 'zu ändern und dann nach dem Trennen auf' _' zurückzusetzen. – steveb