2017-01-26 3 views
1

rには、ID文字列が10文字以下のdata framedf)があります。Rに複数の列を作成するために、データフレームの列内の文字数で文字列を分割します。

df: 
     ID   Var1 Var2 
    1 0334KLM001 aa xx 
    2 1334HDM002 zvv rr 
    3 2334WEM003 qetr qwe 
    4 3334OKT004 ff sdf 
    5 4334WER005 ee sdf 
    6 5334BBC006 qly ssg 
    7 6334QQQ007 kk htj 
    8 7334AAA008 uu yjy 
    9 8334CBU009 ww wttt 
    10 9334MLO010 aa dg 

意向:
rコマンドを使用して、私は文字だけの番号で二つの追加列にIDを分割したいと思います。例えば、私はSpl_1ID列の最初の4つの文字を持っており、Spl_2ID文字(すなわち 5時10分)の残りの部分を持っているdfに2列(Spl_1 & Spl_2)を追加したいと思います。

期待outputは次のように次のようになります。

output: 

    ID   Var1 Var2 Spl_1 Spl_2 
1 0334KLM001 aa xx  0334 KLM001 
2 1334HDM002 zvv rr  1334 HDM002 
3 2334WEM003 qetr qwe  2334 WEM003 
4 3334OKT004 ff sdf  3334 OKT004 
5 4334WER005 ee sdf  4334 WER005 
6 5334BBC006 qly ssg  5334 BBC006 
7 6334QQQ007 kk htj  6334 QQQ007 
8 7334AAA008 uu yjy  7334 AAA008 
9 8334CBU009 ww wttt 8334 CBU009 
10 9334MLO010 aa dg  9334 MLO010 

は、私は、次の質問読み:Q1 & Q2 .Although非常に有益を、それでも、私は、文字番号で刺さを分割する方法ことを取得できませんでした。私はstr_subコマンドを使用して学ぶ 'stringr'パッケージを見つけました。私は数で分けることができます。以下を参照:

library(stringr) 
ID <- "0334KLM001" 
str_sub(ID, c(1,5), c(4,10)) 
[1] "0334" "KLM001" 

しかし、私は上記のようoutputを取得するために他のrコマンド(複数可)と結合する方法がわかりませんか?

+2

'DF $ spl_1 <ため - SUBSTR(DFの$のID、1、4)。 df $ spl_2 < - substr(df $ ID、5、10) 'それを行う必要があります。 – lmo

答えて

3

我々は3つの列をしたい場合は先頭の数字は固定長でない場合、我々は、sep

separate(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), sep = c(4,8), remove = FALSE) 
#   ID Spl_1 Spl_2 Spl_3 Var1 Var2 
#1 0334KLM001 0334 KLM0 01 aa xx 
#2 1334HDM002 1334 HDM0 02 zvv rr 
#3 2334WEM003 2334 WEM0 03 qetr qwe 
#4 3334OKT004 3334 OKT0 04 ff sdf 
#5 4334WER005 4334 WER0 05 ee sdf 
#6 5334BBC006 5334 BBC0 06 qly ssg 
#7 6334QQQ007 6334 QQQ0 07 kk htj 
#8 7334AAA008 7334 AAA0 08 uu yjy 
#9 8334CBU009 8334 CBU0 09 ww wttt 
#10 9334MLO010 9334 MLO0 10 aa dg 

vectorを渡すことができseparate

library(tidyr) 
separate(df, ID, into = c("Spl_1", "Spl_2"), sep = 4, remove = FALSE) 
#   ID Spl_1 Spl_2 Var1 Var2 
#1 0334KLM001 0334 KLM001 aa xx 
#2 1334HDM002 1334 HDM002 zvv rr 
#3 2334WEM003 2334 WEM003 qetr qwe 
#4 3334OKT004 3334 OKT004 ff sdf 
#5 4334WER005 4334 WER005 ee sdf 
#6 5334BBC006 5334 BBC006 qly ssg 
#7 6334QQQ007 6334 QQQ007 kk htj 
#8 7334AAA008 7334 AAA008 uu yjy 
#9 8334CBU009 8334 CBU009 ww wttt 
#10 9334MLO010 9334 MLO010 aa dg 

を使用することができます使用extract

extract(df, ID, into = c("Spl_1", "Spl_2"), "^([0-9]+)(.*)", remove = FALSE) 

3列、

extract(df, ID, into = c("Spl_1", "Spl_2", "Spl_3"), "(.{4})(.{4})(.*)", remove = FALSE) 
+0

私の好奇心のために、私は3つの列をしたい場合はどうしますか?たとえばSpl_1(1:4)、Spl_2(5:8)、Spl_3(9:10)などです。 0334KLM001のように0334、KLM0、01? – Daniel

+1

@ダニエルあなたは 'extract 'を使用することができます。' extract(df、ID、into = c(" Spl_1 "、" Sp1_2 "、" Sp1_3 ")、"(。{4})(。 ( "Spl_1"、 "Spl_2"、 "Spl_3")、sep = c(4,8)、remove = FALSE) ' – akrun

関連する問題