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.
Hinweis, Sie haben einen Tippfehler in Ihrem ursprünglichen Datenrahmen, Sie haben 'gorup2_c = 14', das sollte' group2_c = 14' sein. – steveb