2016-07-19 4 views
1

에 여러 열로 문자 열을 분할하는 방법 :나는 dataframe <code>x</code>이 어떻게 R

나는 새 열 Name에 지역의 이름을 추출하는 District 열을 분할 할
dput(x) 
structure(list(District = structure(c(6L, 6L, 6L, 6L, 6L, 6L), .Label = c("District - Central (06)", 
"District - East (04)", "District - New Delhi (05)", "District - North (02)", 
"District - North East (03)", "District - North West (01)", "District - South (09)", 
"District - South West (08)", "District - West (07)"), class = "factor"), 
    Age = structure(c(103L, 1L, 2L, 14L, 25L, 36L), .Label = c("0", 
    "1", "10", "100+", "11", "12", "13", "14", "15", "16", "17", 
    "18", "19", "2", "20", "21", "22", "23", "24", "25", "26", 
    "27", "28", "29", "3", "30", "31", "32", "33", "34", "35", 
    "36", "37", "38", "39", "4", "40", "41", "42", "43", "44", 
    "45", "46", "47", "48", "49", "5", "50", "51", "52", "53", 
    "54", "55", "56", "57", "58", "59", "6", "60", "61", "62", 
    "63", "64", "65", "66", "67", "68", "69", "7", "70", "71", 
    "72", "73", "74", "75", "76", "77", "78", "79", "8", "80", 
    "81", "82", "83", "84", "85", "86", "87", "88", "89", "9", 
    "90", "91", "92", "93", "94", "95", "96", "97", "98", "99", 
    "Age not stated", "All ages"), class = "factor"), Total = c(3656539L, 
    56131L, 58644L, 63835L, 63859L, 64945L), Rural = c(213950L, 
    3589L, 3757L, 4200L, 4102L, 4223L), Urban = c(3442589L, 52542L, 
    54887L, 59635L, 59757L, 60722L)), .Names = c("District", 
"Age", "Total", "Rural", "Urban"), row.names = c(NA, 6L), class = "data.frame") 

. 예 : "District - North West (01)"는 "North West"라고 나눠야합니다. 나는 str_split_fixed을 시도하고있어 :

x 
        District  Age Total Rural Urban 1 name 
1 District - North West (01) All ages 3656539 213950 3442589  North West (01) 
2 District - North West (01)  0 56131 3589 52542  North West (01) 
3 District - North West (01)  1 58644 3757 54887  North West (01) 
4 District - North West (01)  2 63835 4200 59635  North West (01) 
5 District - North West (01)  3 63859 4102 59757  North West (01) 
6 District - North West (01)  4 64945 4223 60722  North West (01) 

나는 코드에서 지역 이름을 분리하는 name 열을 분할 다시 같은 기능을 사용하려고하지만, 그것은 나에게 다음과 같은 오류를 제공합니다 :

Error in stri_split_regex(string, pattern, n = n, simplify = TRUE, opts_regex = attr(pattern, : Incorrectly nested parentheses in regexp pattern. (U_REGEX_MISMATCHED_PAREN)

거기인가 단일 함수에서 패턴을 기반으로 여러 열로 문자 열을 분할하는 방법?

+0

당신이 사용할 수있는'Strsplit()'여기 –

+0

@PankajKaundal : 나는 그것을 시도했지만, 결과는 목록입니다. 또한 이름에서 코드를 분리하는 문제는 여전히 문제입니다. 예 : "노스 웨스트"를 "(01)"에서 분리. – rar

답변

2

당신은 당신이 gsub으로 원하는 것을 얻을 수 있습니다

gsub("^.* +- +([A-Za-z ]+) \\(.*$", "\\1", df$District) 
[1] "North West" "North West" "North West" "North West" "North West" "North West" 

gsub (에 첫 번째 인수 "..^* + - + ([A-ZA-Z] +) \ (* $")

문자열 "^"의 시작 부분에서 ". *"뒤에 하나 이상의 공백, 하이픈 및 하나 이상의 공백이 오는 "*."문자와 일치합니다. + - "다음에 (적어도 하나의) 문자와 공백"[A-Za-z] + "로 구성된 다음 텍스트"() "를 캡처하십시오. \\ (", 모든 항목을 일치시킵니다. il ". * $"텍스트의 끝.

gsub의 두 번째 인수 인 "\\ 1"은 텍스트를 괄호로 묶인 텍스트로 바꿉니다.

는 변수에 할당하려면 : 당신은 당신이 여기있는 여분의 물건을 제거 할 gsub을 사용할 수 있습니다

df$name <- gsub("^.* +- +([A-Za-z ]+) \\(.*$", "\\1", df$District) 
+0

@ 아이모 : 감사합니다! 그것은 완벽하게 작동했습니다. 어떻게 작동하는지 설명해 주시겠습니까? – rar

+0

그래. 내가 사용한 정규 표현식을 설명하는 편집을 참조하십시오. 이 도구에 익숙해지면 정규 표현식이 소프트웨어에서 널리 사용되므로 매우 유용합니다. – lmo

2

당신은

library(stringr) 

data.frame(str_split_fixed(df$District, " ", 3))

X1  X2  X3 
1 District - North West (01) 
2 District - North West (01) 
3 District - North West (01) 
4 District - North West (01) 
5 District - North West (01) 
6 District - North West (01) 

을 사용할 수,

gsub("[[:digit:]]","",df$X3) 
gsub("[[:punct:]]","",df$X3) 

+0

사용하는 외부 패키지에 대해 언급해야합니다. (nice solution btw) – Sotos

+0

또는'data.frame (str_split_fixed (a $ District, ", 4))'이 직접 사용될 수 있습니다. 감사! – rar

+0

@rar : 4로 나누면 North와 West는 둘 사이에 공백이 있으므로 서로 다른 열에 들어갑니다. –

1

또한 일치시킬 수 있습니다 및 추출물 :

library(stringi) 
library(dplyr) 
library(purrr) 

mutate(x, 
     name=map_chr(stri_match_all_regex(District, "- ([[:alpha:]]+ [[:alpha:]]+) "), function(x) x[,2]), 
     code=map_chr(stri_match_all_regex(District, "\\(([[:digit:]]+)\\)"), function(x) x[,2])) 

##      District  Age Total Rural Urban  name code 
## 1 District - North West (01) All ages 3656539 213950 3442589 North West 01 
## 2 District - North West (01)  0 56131 3589 52542 North West 01 
## 3 District - North West (01)  1 58644 3757 54887 North West 01 
## 4 District - North West (01)  2 63835 4200 59635 North West 01 
## 5 District - North West (01)  3 63859 4102 59757 North West 01 
## 6 District - North West (01)  4 64945 4223 60722 North West 01