>

이 및 이 이지만 내 데이터를 처리 할 수는 없습니다

# here my data
    data <- data.frame(text = c("SOME UPPERCASES     And some Lower Cases"
                                ,"OTHER UPPER CASES   And other words"
                                , "Some lower cases        AND UPPER CASES"
                                ,"ONLY UPPER CASES"
                                ,"Only lower cases, maybe"
                                ,"UPPER lower UPPER!"))
    data
                                         text
    1 SOME UPPERCASES     And some Lower Cases
    2      OTHER UPPER CASES   And other words
    3  Some lower cases        AND UPPER CASES
    4                         ONLY UPPER CASES
    5                  Only lower cases, maybe
    6                        UPPER lower UPPER!

원하는 결과는 다음과 같아야합니다 :

      V1                  V2
1      SOME UPPERCASES     And some Lower Cases
2      OTHER UPPER CASES   And other words
3      AND UPPER CASES     Some lower cases        
4      ONLY UPPER CASES    NA
5      NA                  Only lower cases, maybe
6      UPPER UPPER!         lower

따라서 모든 단어는 대문자 만 사용하고 다른 단어는 대문자로 구분하십시오.

테스트로 한 줄만 시도했지만 어떤 것도 잘 작동하지 않습니다.

strsplit(x= data$text[1], split="[[:upper:]]")   # error
gsub('([[:upper:]])', ' \\1', data$text[1])      # not good results
library(reshape)
transform(data, FOO = colsplit(data$text[1], split = "[[:upper:]]", names = c('a', 'b')))                                        # neither good results

  • 답변 # 1

    데이터 :

    data <- data.frame(text = c("SOME UPPERCASES     And some Lower Cases"
                                ,"OTHER UPPER CASES   And other words"
                                , "Some lower cases        AND UPPER CASES"
                                ,"ONLY UPPER CASES"
                                ,"Only lower cases, maybe"
                                ,"UPPER lower UPPER!"))
    
    

    코드 :

    library(magrittr)
    UpperCol    <- regmatches(data$text , gregexpr("\\b[A-Z]+\\b",data$text)) %>% lapply(paste, collapse = " ") %>% unlist
    notUpperCol <- regmatches(data$text , gregexpr("\\b(?![A-Z]+\\b)[a-zA-Z]+\\b",data$text, perl = T)) %>% lapply(paste, collapse = " ") %>% unlist
    result <- data.frame(I(UpperCol), I(notUpperCol))
    result[result == ""] <- NA
    
    

    결과 :

    #           UpperCol            notUpperCol
    #1   SOME UPPERCASES   And some Lower Cases
    #2 OTHER UPPER CASES        And other words
    #3   AND UPPER CASES       Some lower cases
    #4  ONLY UPPER CASES                   <NA>
    #5              <NA> Only lower cases maybe
    #6       UPPER UPPER                  lower
    
    

    <시간>

    트릭은 정규식입니다. 정규식을 배우십시오

    최적화를 위해 Wiktor Stribiżew에게 감사합니다.

  • 답변 # 2

    stringi 패키지를 사용하는 접근법 :

    library(stringi)
    l1 <- stri_extract_all_regex(dat$text, "\\b[A-Z]+\\b")
    l2 <- mapply(setdiff, stri_extract_all_words(dat$text), l1)
    res <- data.frame(all_upper = sapply(l1, paste, collapse = " "),
                      not_all_upper = sapply(l2, paste, collapse = " "),
                      stringsAsFactors = FALSE)
    res[res == "NA"] <- NA
    res[res == ""] <- NA
    
    

    다음을 제공합니다 :

    와이즈 비즈 와이즈 비즈

  • 답변 # 3

    > res all_upper not_all_upper 1 SOME UPPERCASES And some Lower Cases 2 OTHER UPPER CASES And other words 3 AND UPPER CASES Some lower cases 4 ONLY UPPER CASES <NA> 5 <NA> Only lower cases maybe 6 UPPER UPPER lower

  • 이전 pandas - 파이썬 그래프 날짜 * 수량
  • 다음 python 3.x - Django에서 IntegerField/CharField를 자동 증분 필드로 만드는 방법 1000001, 1000002