2016-05-13 14 views
3

私はいくつかの変数とシナリオの統計を含むデータフレームを持っています。データは次のようになります。tidyr正規表現を抽出

df <- data.frame(
    Scenario = c('base','stress','extreme'), 
    x_min = c(-3,-2, -2.5), 
    x_mean = c(0,0.25, 1), 
    x_max = c(2, 1, 3), 
    y_min = c(-1.5, -2, -3), 
    y_mean = c(1, 2, 3), 
    y_max = c(5, 3, 3.5), 
    z_min = c(0, 1, 3), 
    z_mean = c(0.25, 2, 5), 
    z_max = c(2, 4, 7) 
) 

    Scenario x_min x_mean x_max y_min y_mean y_max z_min z_mean z_max 
1  base -3.0 0.00  2 -1.5  1 5.0  0 0.25  2 
2 stress -2.0 0.25  1 -2.0  2 3.0  1 2.00  4 
3 extreme -2.5 1.00  3 -3.0  3 3.5  3 5.00  7 

私はtidyr年代を使いたい(this questionにハドレーの回答と同様に)集まって抽出機能のような形式のデータを取得する:

new_df 
    Scenario variable min mean max 
1  base  x -3.0 0.00 2.0 
2 stress  x -2.0 0.25 1.0 
3 extreme  x -2.5 1.00 3.0 
4  base  y -1.5 1.00 5.0 
5 stress  y -2.0 2.00 3.0 
6 extreme  y -3.0 3.00 3.5 
7  base  z 0.0 0.25 2.0 
8 stress  z 1.0 2.00 4.0 
9 extreme  z 3.0 5.00 7.0 

コマンド私はこれまでのように見えます:

new_df <- df %>% 
      gather(key, value, -Scenario) %>% 
      extract(key, c("min", "mean", "max"), "regex") 

これは私が苦労している正規表現です。上記に参照し、問題の答え、次の私が試してみた:

"_min|_mean|_max" --> idea being to capture the 3 different groups 

私のようなルックスを取得エラー:私はこのエラーが言っていると思う何

Error in names(l) <- into : 
    'names' attribute [3] must be the same length as the vector [0] 

は、「正規表現ではないです私はそれを渡したc("min","mean","max")に分類する3つのグループを見つける。

これをどのような正規表現で使用できますか?それとももっと良い方法がありますか?

答えて

3

あなたの最初のカラム名がうまくseparateあなたが2列にそれらを分割する必要があるすべてで、変数と統計を分離アンダ​​ースコアでフォーマットされているので、必要なのは

df %>% gather(var, val, -Scenario) %>% 
    separate(var, into = c('var', 'stat'), sep = '_') %>% 
    spread(stat, val) 
# Scenario var max mean min 
# 1  base x 2.0 0.00 -3.0 
# 2  base y 5.0 1.00 -1.5 
# 3  base z 2.0 0.25 0.0 
# 4 extreme x 3.0 1.00 -2.5 
# 5 extreme y 3.5 3.00 -3.0 
# 6 extreme z 7.0 5.00 3.0 
# 7 stress x 1.0 0.25 -2.0 
# 8 stress y 3.0 2.00 -2.0 
# 9 stress z 4.0 2.00 1.0 

です。 spreadは、長いものから広いものに並べ替えます。

+1

で複数のpatternsを取ることができ、これはdata.tableからmeltで簡単に行うことができます!私のカラムタイトルは実際には複数のアンダースコア(例えば、 'stat_1_min、stat_2_min')を含んでいたので、' separate 'の 'sep'引数を正規表現にする必要がありました。私が使った正規表現は '(_)(?!。* _)' – reidjax

2

それは私が必要とまさにmeasure

library(data.table) 
nm1 <- unique(substr(names(df)[-1], 1, 1)) 
melt(setDT(df), measure = patterns("min$", "mean$", "max$"), 
     value.name= c("min", "mean", "max"))[, variable := nm1[variable]][] 
# Scenario variable min mean max 
#1:  base  x -3.0 0.00 2.0 
#2: stress  x -2.0 0.25 1.0 
#3: extreme  x -2.5 1.00 3.0 
#4:  base  y -1.5 1.00 5.0 
#5: stress  y -2.0 2.00 3.0 
#6: extreme  y -3.0 3.00 3.5 
#7:  base  z 0.0 0.25 2.0 
#8: stress  z 1.0 2.00 4.0 
#9: extreme  z 3.0 5.00 7.0 
関連する問題