2017-12-19 34 views
-7

종종 janitor 패키지의 clean_names() 기능을 사용합니다. 비슷한 기능이 요소 이름이나 문자로 구성되어있을 때 열 항목을 정리할 수 있는지 궁금합니다.R : 요인 수준을 청소하는 기능이 있습니까? 데이터 프레임에서 문자를 열 방향으로?

"clean"이란 말은 관리 패키지에서 clean_names() 함수와 동일한 작업을 수행해야한다는 의미입니다. 공백을 밑줄로 변경하고, 대문자를 소문자로 변경하고, 전체 중지를 제거합니다.

고마워요!

+4

당신이 '열 항목을 청소'의미는 무엇입니까? – LAP

답변

2

그냥 janitor::clean_names()에서 내부 비트를 사용

# #' 'Clean' a character/factor vector like `janitor::clean_names()` does for data frame columns 
# #' 
# #' Most of the internals are from `janitor::clean_names()` 
# #' 
# #' @param x a vector of strings or factors 
# #' @param refactor if `x` is a factor, return a ref-factored factor? 
# #'  Default: `FALSE` == return character vector. 
clean_vec <- function (x, refactor=FALSE) { 

    require(magrittr, quietly=TRUE) 

    if (!(is.character(x) || is.factor(x))) return(x) 

    x_is_factor <- is.factor(x) 

    old_names <- as.character(x) 

    new_names <- old_names %>% 
    gsub("'", "", .) %>% 
    gsub("\"", "", .) %>% 
    gsub("%", "percent", .) %>% 
    gsub("^[ ]+", "", .) %>% 
    make.names(.) %>% 
    gsub("[.]+", "_", .) %>% 
    gsub("[_]+", "_", .) %>% 
    tolower(.) %>% 
    gsub("_$", "", .) 

    dupe_count <- sapply(1:length(new_names), function(i) { 
    sum(new_names[i] == new_names[1:i]) 
    }) 

    new_names[dupe_count > 1] <- paste(
    new_names[dupe_count > 1], dupe_count[dupe_count > 1], sep = "_" 
) 

    if (x_is_factor && refactor) factor(new_names) else new_names 

} 

예 :

vec <- stringi::stri_rand_strings(10, 10, pattern = "[A-Za-z0-9\\.\\-\\?_\\,\\*\\+]") 

vec 
## [1] "TzMF-iCHX6" "v-b+2cpul5" "JPMwpP35K6" "5Z3RQf50Tb" "HaPzKB5jhH" 
## [6] "3gz6P4?0uU" "ofXkhP4Q1O" "?,4NvCjw,3" "AlG9dWJ,Ze" "MrPrvuYH4*" 

clean_vec(vec) 
## [1] "tzmf_ichx6" "v_b_2cpul5" "jpmwpp35k6" "x5z3rqf50tb" "hapzkb5jhh" 
## [6] "x3gz6p4_0uu" "ofxkhp4q1o" "x_4nvcjw_3" "alg9dwj_ze" "mrprvuyh4" 

clean_vec(factor(vec)) 
## [1] "tzmf_ichx6" "v_b_2cpul5" "jpmwpp35k6" "x5z3rqf50tb" "hapzkb5jhh" 
## [6] "x3gz6p4_0uu" "ofxkhp4q1o" "x_4nvcjw_3" "alg9dwj_ze" "mrprvuyh4" 

clean_vec(factor(vec), TRUE) 
## [1] tzmf_ichx6 v_b_2cpul5 jpmwpp35k6 x5z3rqf50tb hapzkb5jhh 
## [6] x3gz6p4_0uu ofxkhp4q1o x_4nvcjw_3 alg9dwj_ze mrprvuyh4 
## 10 Levels: alg9dwj_ze hapzkb5jhh jpmwpp35k6 mrprvuyh4 ... x5z3rqf50tb 
+1

놀라운 와우! 불행히도 질문은 보류되었다. 그러나 이것은 많은 사람들에게 정말 유용한 물건이다. –

+0

더 명확하게하기 위해 질문을 수정했다면 다시 열어 보겠습니다. – hrbrmstr

+0

불행히도 작동하지 않았지만 응답 해 주셔서 감사합니다! –