2016-01-09 10 views
5

私はこのコラムごとに2つの文字を分割したい 分割文字列を複数回ごとに2つの文字

df<- 
    data.frame(a=c("AaBbCC","AABBCC","AAbbCC"))#df 
     a 
1 AaBbCC 
2 AABBCC 
3 AAbbCC 

のように見える私のデータフレーム内の文字列を持っています。この場合、私は VA,VB,VCという3つの列を取得したいと考えています。 私は試しました

library(tidyr) 
library(dplyr) 
df<- 
    data.frame(a=c("AaBbCC","AABBCC","AAbbCC"))%>% 
    separate(a,c(paste("V",LETTERS[1:3],sep="")),sep=c(2,2)) 
VA VB VC 
1 Aa BbCC 
2 AA BBCC 
3 AA bbCC 

これは望ましい結果ではありません。私は今VCにある結果を持っています。VB(全文B)とVC(全文C)2文字ごとにRを分割するにはどうすればいいですか?列内の文字列の長さは、すべての行で常に同じです(この例では6)。 長さが10より大きい文字列があります。

+8

iが「(tidyrソリューション 'strsplit(Cを持っていけないですperl = TRUE) ' – rawr

答えて

5

あなたは実際にはかなり近くでした。あなたが得る

df <- separate(df, a, c(paste0("V",LETTERS[1:3])),sep = c(2,4)) 

:あなたが行うことができ、ベースRで

> df 
    VA VB VC 
1 Aa Bb CC 
2 AA BB CC 
3 AA bb CC 

は(@ RAWRさんのコメントからの借入):sep = c(2,4)代わりsep = c(2,2)のようあなたは、セパレータ-位置を指定する必要が

l <- ave(as.character(df$a), FUN = function(x) strsplit(x, '(?<=..)', perl = TRUE)) 
df <- data.frame(do.call('rbind', l)) 

これは:

> df 
    X1 X2 X3 
1 Aa Bb CC 
2 AA BB CC 
3 AA bb CC 
+0

Haventはc(2,4)を考えました。私はそれがすべての分離の後に0から数え始めると仮定していました。どうもありがとうございました。 – user2386786

4

私たちは、ファイルから直接読んでいるならbase R

read.csv(text=gsub('(..)(?!$)', '\\1,', df$a, 
    perl=TRUE),col.names=paste0("V", LETTERS[1:3]), header=FALSE) 
# VA VB VC 
#1 Aa Bb CC 
#2 AA BB CC 
#3 AA bb CC 

でこれを行うことができ、別のオプションはread.fwf

read.fwf(file="yourfile.txt", widths=c(2,2,2), skip=1) 
関連する問題