2017-11-01 12 views
1

큰 데이터 세트가 있는데 그 중 작은 샘플은 아래 4x5 tibble처럼 보입니다. 4 행에서 볼 수 있듯이cSplit Coerces 불필요 NA 행

library(splitstackshape) 

dt <- tibble(
a = c("Quartz | White Spirit | Wildfire", "Quiet Riot", "Race Against Time", "Down | Heart Lane | X | Breaking H"), 
b = c("Muthas Pride", "Killer Girls/Slick Black Cadillac", "Demo 1980", "Life 55"), 
c = c("Split", "Single", "Demo", "Split"), 
d = c("Birmingham, England | Hartlepool, England | Sheffield, South Yorkshire, England", "Los Angeles, California", "Nottingham, England", "Liverpool | Beijing | | NYC"), 
e = c("wf | ef | ff", "g", "f", "cf | af | df | rf") 
) 

dt.s <- subset(dt, c == "Split") 
dt.split <- cSplit(dt.s, c("a", "d", "e"), c("|", "|", "|"), "long") 
dt.split 

그러나이 나스의 추가 행을 강제 변환 :

   a   b  c         d e 
1:  Quartz Muthas Pride Split     Birmingham, England wf 
2: White Spirit Muthas Pride Split     Hartlepool, England ef 
3:  Wildfire Muthas Pride Split Sheffield, South Yorkshire, England ff 
4:   NA Muthas Pride Split         NA NA 
5:   Down  Life 55 Split       Liverpool cf 
6: Heart Lane  Life 55 Split        Beijing af 
7:   X  Life 55 Split          df 
8: Breaking H  Life 55 Split         NYC rf 

이가 아닌 내가 다음과 같이 변수 c=="Split"를 사용하여 고유 한 행에 여러 개의 구분 된 열을 분할하기 위해 노력하고있어 두 열만 분리하면 문제가 생깁니다. NA 행을 생성하지 않으려면 어떻게해야합니까? 그리고 서브 세트하지 않고 cSplitc으로 만들 수있는 방법이 있습니까?

답변

0

우리가 tibble를 사용하고, 우리는 cSplit는 NA의 추가 행을주는 이유에 관한 NA

library(tidyr) 
separate_rows(dt.s, c('a', "d", "e"), sep="\\s*\\|\\s*") %>% 
     select_at(names(dt.s)) 
# A tibble: 7 x 5 
#    a   b  c         d  e 
#   <chr>  <chr> <chr>        <chr> <chr> 
#1  Quartz Muthas Pride Split     Birmingham, England wf 
#2 White Spirit Muthas Pride Split     Hartlepool, England ef 
#3  Wildfire Muthas Pride Split Sheffield, South Yorkshire, England ff 
#4   Down  Life 55 Split       Liverpool cf 
#5 Heart Lane  Life 55 Split        Beijing af 
#6   X  Life 55 Split          df 
#7 Breaking H  Life 55 Split         NYC rf 

을 제공하지 않는 separate_rows을 사용할 수 있습니다, 그것은 더 나은 것 '와이드'형식의 출력을 확인하십시오.

cSplit(dt.s, c("a", "d", "e"), "|") 
#    b  c a_1   a_2  a_3  a_4     d_1     d_2         d_3 d_4 e_1 e_2 e_3 e_4 
#1: Muthas Pride Split Quartz White Spirit Wildfire   NA Birmingham, England Hartlepool, England Sheffield, South Yorkshire, England NA wf ef ff NA 
#2:  Life 55 Split Down Heart Lane  X Breaking H   Liverpool    Beijing          NYC cf af df rf 

여기에서 두 번째 행에 대한 구분자의 수는입니다은 'a'열에 대해서만 세 개의 구분 기호가 있으므로 첫 번째 행에 대해 NA을 작성하는 4입니다. 따라서 '긴'형식을 사용하면이 NA 행이 전파됩니다. 버그 일 수 있습니다.

+0

감사하지만 위의 코드가 아닌 데이터 세트에서 위의 코드를 실행하면 다음 오류가 발생합니다. '오류 : 모든 중첩 열의 요소 수가 같아야합니다.' – 1984

+0

@ 1984 죄송합니다. 나는 당신의 예제 데이터만을 테스트했다. – akrun

0

당신의 cSplit 전화에 makeEqual = FALSE를 추가보십시오 : 또한

cSplit(dt.s, c("a", "d", "e"), "|", "long", makeEqual = FALSE) 
##    a   b  c         d e 
## 1:  Quartz Muthas Pride Split     Birmingham, England wf 
## 2: White Spirit Muthas Pride Split     Hartlepool, England ef 
## 3:  Wildfire Muthas Pride Split Sheffield, South Yorkshire, England ff 
## 4:   Down  Life 55 Split       Liverpool cf 
## 5: Heart Lane  Life 55 Split        Beijing af 
## 6:   X  Life 55 Split          df 
## 7: Breaking H  Life 55 Split         NYC rf 

, 당신은 이미 "tidyverse"에서 패키지를 사용하고 있기 때문에,이 같은 분할과 함께 서브 세트를 할 수 있습니다

dt %>% 
    filter(c == "Split") %>% 
    cSplit(c("a", "d", "e"), "|", "long", makeEqual = FALSE)