2017-09-11 8 views
-1

R 문제를 검색해 보았지만 유용한 정보가 없습니다.가능한 모든 쉼표로 구분 된 문자열을 얻는 방법

나는 이런 dataframe 있습니다

Post_ID New_Mentions_1  New_Mentions_2 
    1   model      
    2  telephone   louis vuitton 
    3   uber   employee 
    4 united states      
    5   onion   pepper, rice, garlic 

을 그리고 내 예상 결과는

Post_ID New_Mentions_1  New_Mentions_2 
    1   model      
    2  telephone   louis vuitton 
    3   uber   employee 
    4 united states      
    5   onion  pepper,rice,garlic 
    5   onion  rice,garlic,pepper 
    5   onion  garlic,pepper,rice 
    5   onion  pepper,garlic,rice 
    5   onion  garlic,rice,pepper 
    5   onion  rice,pepper,garlic 

이를위한 프로그램을 제발 도와주세요 New_Mention_2

의 모든 가능한 주문으로 dataframe을 확대하고 있습니다. 또한 쉼표로 구분 된 5 개의 키워드가있는 행이 거의 없습니다.

+1

이것은 흥미로운 요구 사항입니다. 왜 당신은 그 항목들의 모든 가능한 순열을 필요로합니까? –

답변

0

이 문제를 처리하는 더 쉬운 방법이 있어야하지만 찾을 수없는 것 같습니다.

df <- structure(list(New_Mentions_1 = c("model", "telephone", "uber", 
     "united_states", "onion"), New_Mentions_2 = c(NA, "louis_vuitton", 
     "employee", NA, "pepper,rice,garlic")), .Names = c("New_Mentions_1", 
     "New_Mentions_2"), class = "data.frame", row.names = c(NA, -5L)) 

먼저 당신이 grep를 사용하여 New_Mentions_2 열에서 여러 값을 df에서 행을 확인하십시오

우리가 같은 dataframe에 대해 이야기하고 있는지 확인하기 위해, 나는 데이터를 다시 게시. 이 함수는 두 번째 열에 쉼표가 포함 된 행을 반환합니다. 그런 다음 고정 할 필요가없는 부분 (즉 두 번째 열에 쉼표가없는 부분)에서 데이터 프레임을 분할하고 newdf이라고 부릅니다. 수정이 필요한 부분은 subdf입니다.

우리 거 어지 subdf와 비트 값의 모든 가능한 조합을 얻고 newdf 데이터 프레임에 결과를 추가하는 (코드 아래 세부 사항) :

library(gtools) 
# Which rows in df have multiple values in the second column? 
inds <- grep(pattern = ",", df$New_Mentions_2) 

subdf <- df[inds, ] 
newdf <- df[-inds, ] 

# Just in case you have multiple 'problematic' rows, we'll loop through all of them 
for(i in 1:nrow(subdf)){ 
    splitted <- strsplit(subdf$New_Mentions_2[i], ", ")[[1]] 
    n  <- length(splitted) 
    shuffled <- permutations(n, n) 
    for(j in 1:nrow(shuffled)){ 
    val_2 <- paste(splitted[shuffled[j, ]], collapse = ", ") 
    val_1 <- subdf$New_Mentions_1[i] 
    newdf <- rbind(newdf, c(val_1, val_2)) 
    } 
} 

'장난'부분 대부분 외부 루프에서 수행됩니다. 먼저, 예를 들어, "고추, 쌀, 마늘"은 , (쉼표 + 공백)마다 나뉩니다. splittedc("pepper", "rice", "garlic")을 포함 할 것이며, gtools-package의 permutations 함수를 사용하여 가능한 모든 조합을 얻을 수 있습니다. 내부 루프의 첫 번째 행에서 셔플 된 문자열은 데이터 프레임의 한 열에 다시 맞출 수 있도록 단일 문자열 (paste()collapse = ", ") 인 인수)로 함께 다시 넣어집니다.