2017-11-01 7 views
1

大きなデータセットを持っていますが、その小さなサンプルは以下の4 x 5チブルのように見えます。 4行目で見られるようにしかし、これは、NASの余分な行を強制しcSplit Coerces Unnecessary NA Row

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 

を:私は以下のように変数c=="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 

これではありません2つの列だけを分割すると問題が発生します。 NA行を生成しないようにするにはどうすればよいですか?そして、cでサブセット化せずにcSplitを動作させる方法はありますか?

答えて

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 

「ワイド」の形式で出力を確認するために、我々は見つけること第二列、すなわち区切り文字の数についてが4の場合、最初の行にはNAが作成されます。これは、 'a列には3つの区切り文字しかないためです。したがって、「長い」形式を使用すると、この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)