2017-10-05 6 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

당신은 stringr에서 str_extract를 사용할 수 있습니다

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+$"))} 

결과 :

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 형태 (예 : 키워드 : 값)로 변환 한 후 gsub을 사용하고 read.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 
관련 문제