2017-10-05 10 views
1

私はカラムが "犯罪"のdata.frameを持っています。すべての犯罪は、物品(アート)、パラグラフ(ABS)およびサブパラグラフ(ジフ)から構成されていますセパレータでカラムを複数のカラムに分割する

df<-data.frame(offence=c("Art. 110 Abs. 3 StGB","Art. 10 Abs. 1 StGB", "Art. 122 SVG", "Art. 1 Ziff. 2 UWG")) 

> df 
       offence 
1 Art. 110 Abs. 3 StGB 
2 Art. 10 Abs. 1 StGB 
3   Art. 122 SVG 
4 Art. 1 Ziff. 2 UWG 

しかし、私はその形でそれを持っている必要があります:

Art Ziff Abs Law 
1 110 NA 3 StGB 
2 10 NA 1 StGB 
3 122 NA NA SVG 
4 1 2 NA UWG 

は何ですかこの結果を得るための最良の方法は?ラップ?

ありがとうございました!

答えて

1

あなたはstr_extractstringrから使用することができます。

library(stringr) 
library(dplyr) 

df$offence %>% 
    {data.frame(Art = str_extract(., "(?<=Art[.]\\s)\\d+"), 
       Ziff = str_extract(., "(?<=Ziff[.]\\s)\\d+"), 
       Abs = str_extract(., "(?<=Abs[.]\\s)\\d+"), 
       Law = str_extract(., "\\w+$"))} 

結果:gsubを使用して、read.dcfを使用してそれを読む:

Art Ziff Abs Law 
1 110 <NA> 3 StGB 
2 10 <NA> 1 StGB 
3 122 <NA> <NA> SVG 
4 1 2 <NA> UWG 
+0

グレート、どうもありがとうございました! –

1

がDCF形式(値すなわちキーワード)に変換します。最後に、read.dcfが生成する行列をデータフレームに変換し、数値列を数値に変換します。パッケージは使用されません。

s <- gsub("(\\S+)[.] (\\d+)", "\\1: \\2\n", df[[1]]) # convert to keyword: value 
s <- sub(" (\\D+)$", "Law: \\1\n\n", s) # handle Law column 
us <- trimws(unlist(strsplit(s, "\n"))) # split into separate components 
DF <- as.data.frame(read.dcf(textConnection(us)), stringsAsFactors = FALSE) 
DF[] <- lapply(DF, type.convert) 

寄付:

Art Abs Law Ziff 
1 110 3 StGB NA 
2 10 1 StGB NA 
3 122 NA SVG NA 
4 1 NA UWG 2 
関連する問題