2016-08-09 6 views
0

共通のカラム名につかまっ:行の列が、私はこのようになり、データフレーム持って

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 

と、私はこれにそれを変換したいと思います:

  mu sd  xx 
group1  10 4  5 
group2  1  2 14 

をどのように1缶をそれを行う?あなたは(オリジナルのポストからのデータに基づいて)次のことを試みることができる

+0

注意、あなたは、元のデータフレームのタイプミスを持っている、あなたは 'gorup2_c = 14'' group2_c = 14'であるべきであります。 – steveb

答えて

1

:状況については

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 

2つの_文字(更新後の)があり、次のようなアプローチは、一時的に_文字を変更します。代替方法は、separate正規表現(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 

肯定的なルックバック演算子を使用すると、同じ結果が得られます。

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) %>% 
    separate(key, c('group_name', 'subgroup_name'), sep = '(?<=[a-z])_') %>% 
    spread(subgroup_name, val) 
+0

名前に2つの "_"があった場合、Steveに感謝しますか? edit – user3022875

+0

を参照してください。 'sep'パラメータは正規表現です。先読みや後ろの演算子を使ってこれを行う方法があります(これを行う方法はわかりません)。別の方法としては、最初の '_'を' | 'のようなものに一時的に変更し、別の' _'を '_'に戻すことです。 – steveb

関連する問題