2017-03-29 9 views
1

상황은 다음과 같습니다. 많은 정수가 들어있는 문자 인 열 "a"가 있습니다. 각 정수는 범주를 나타냅니다. 각 관찰에 대해 그들이 포함하고있는 독특한 레벨을 알고 싶습니다. b 열은 원하는 결과를 나타냅니다. 중복으로 정리되었지만 각 고유 한 수준을 나타냅니다. 내가 알고 싶은 것은 칼럼 a를 어떻게 청소하여 칼럼 b처럼 보이는지입니다. 60k 행의 솔루션을 구현해야합니다.중복 팩터 수준에서 문자 관찰을 깨끗이하십시오.

             a   b 
1 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5 | 4, 5 
2       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 | 2 
3   86, 86, 86, 86, 86, 37, 37, 37, 37, 37, 37, 8, 8 | 86, 37, 8 

a <- c("4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5, 4, 5", "2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2", "86, 86, 86, 86, 86, 37, 37, 37, 37, 37, 37, 8, 8") 
b <- c("4, 5", "2", "86, 37, 8") 
df <- data.frame(a, b) 

나는 중복 요소 값을 삭제에 대해 몇 가지 게시물을 읽고,하지만 당신은 시도 할 수로서 자신이 유용한 아무것도 양보하지 않습니다.

droplevels(factor(df$a)) 

기본적으로이 문제는 해결되지만 60k 행에는 적합하지 않습니다.

df$a[1] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[1], "[[:digit:]]+"))))) 
df$a[2] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[2], "[[:digit:]]+"))))) 
df$a[3] <- factor(unique(as.numeric(unlist(str_extract_all(df$a[3], "[[:digit:]]+"))))) 
+0

자신에게 질문하는 것이 좋습니다. 제 데이터가 올바른 형식입니까? 쉼표로 구분 된 숫자로 된 문자열을 가지고 있다면 아마도 벡터 목록이나 그룹화 된 데이터 프레임을 만들고 싶을 것입니다. – dash2

답변

3

여기서 sapply의 사용을 놓쳤습니다. 즉,이 같은 예 요소에 의해 요소를 구성하는 데에서 당신을 방지 :

df$a <- sapply(a,function(i){ 
    paste(unique(strsplit(i,", ")[[1]]), 
     collapse = ", ") 
}) 

df$a 
#> [1] "4, 5"  "2"   "86, 37, 8" 

가 명심 문자 벡터에 strsplit() 작품. 따라서 데이터를 만들 때 stringsAsFactors = FALSE을 사용하거나 as.character()을 사용하여 요인 변수를 먼저 문자로 변환하십시오. 내 코드에서 나는 단지 벡터 a을 사용한다.

사이드 바 : stringr 패키지를 좋아하지만,이 경우 strsplit()을 사용하면 코드가 더 빨라집니다. 위의 코드를 사용하면 사용하는 정규 표현식으로 인해 많은 오버 헤드가 발생하지 않습니다.