2016-08-03 12 views
0

私のデータフレームの変数名に複数の変数に関する情報が含まれている場合があります。たとえば、「cs_ta_p50」と入力します。私はmeltを使ってデータを溶かしました。だから今、私は私がすることでこれを実行しようと変数「」タイプ「」と「」12月「」融解と再形成R

を作成する必要があり、この問題を解決するには

|variable value | 
|cs_ta_p50 ... | 
を持っている:

cbind(mdata, colsplit(mdata$variable,"(\\_p50)", names=c("type","dec"))) 

しかし、これは私が本当に必要なとき

|variable value type  dec | 
    |cs_ta_p50 ... cs_ta  NA | 

になり

|variable value type  dec | 
|cs_ta_p50 ... cs_ta  p50| 

これは正規表現が間違っていると思われるので、どうすればよいですか?

+1

ドロップデータを再形成するため、これらすべての古いパッケージで、代わりに[](https://blog.rstudio.org/2014/07/22/introducing-tidyr/)を使用します。それは前任者の間違いから学び、すべてをよりきれいにする。実際の操作は 'extract(mdata、variable、c( 'type'、 'dec')、 '^(。+)_([^ _] +)$')'です。 –

+0

私は見てみましょう! – Floris

答えて

4

次の2つのラインでそれを行うことができます。

# data 
require(data.table) 
dt <- data.table(variable = c("cs_ta_p50", "cs_df_p60", "cs_jk_p67"), 
       value = c(1,2,3)) 

# solution 
dt[, c('prefix', 'type', 'dec') := tstrsplit(variable, '_')] 
dt[, type := paste(prefix, type, sep = '_')] 

EDIT

おかげ@MichaelChirico、良いもの。だから、完全なソリューションは、

dt[, c('type', 'dec') := tstrsplit(variable, '_(?=[^_]*$)', perl = TRUE)] 
+3

regex '_(?= p)'と 'perl = TRUE'を使って、これを1行で行うことができます(より堅牢な' _(?= [^ _] * $) ') – MichaelChirico

0

ちょっとジャンクですが、これはうまくいくはずです!

library(tidyr) 

df <- data.frame(variable = c("cs_ta_p50", "cs_df_p60", "cs_jk_p67")) 

df_new <- df %>% 
    mutate(x = variable) %>% 
    separate(x, into = c("type1", "type2", "dec"), sep = c("\\_")) %>% 
    mutate(type = paste0(type1, "_", type2)) %>% 
    select(variable, type, dec) 

df_new 

出力:data.table::tstrsplit

variable type dec 
1 cs_ta_p50 cs_ta p50 
2 cs_df_p60 cs_df p60 
3 cs_jk_p67 cs_jk p67