2016-04-23 8 views
2

私はいくつかの整頓行動について混乱しています。私はこのような単一の応答ネスト解除することができますtidyr:NAカウントが異なる複数のネストネスト

library(tidyr) 

resp1 <- c("A", "B; A", "B", NA, "B") 
resp2 <- c("C; D; F", NA, "C; F", "D", "E") 
resp3 <- c(NA, NA, "G; H; I", "H; I", "I") 
data <- data.frame(resp1, resp2, resp3, stringsAsFactors = F) 

tidy <- data %>% 
    transform(resp1 = strsplit(resp1, "; ")) %>% 
    unnest() 

# Source: local data frame [6 x 3] 
# 
#  resp2 resp3 resp1 
#  (chr) (chr) (chr) 
# 1 C; D; F  NA  A 
# 2  NA  NA  B 
# 3  NA  NA  A 
# 4 C; F G; H; I  B 
# 5  D H; I NA 
# 6  E  I  B 

をしかし、私は私のデータセット内の複数の列をネスト解除する必要がある、と列は、NASのさまざまな数字を持っています。私はこれを試してみましたが、それがエラーを投げた:

data %>% 
    transform(resp1 = strsplit(resp1, "; "), 
      resp2 = strsplit(resp2, "; "), 
      resp3 = strsplit(resp3, "; ")) %>% 
    unnest() 
# Error: All nested columns must have the same number of elements. 

私は上記のコードは次のように私に同じ出力を与えるだろうと予想:

# unnesting multiple response (desired output/is there a better way?) 
data %>% 
    transform(resp1 = strsplit(resp1, "; ")) %>% 
    unnest() %>% 
    transform(resp2 = strsplit(resp2, "; ")) %>% 
    unnest() %>% 
    transform(resp3 = strsplit(resp3, "; ")) %>% 
    unnest() 

#  resp1 resp2 resp3 
#  (chr) (chr) (chr) 
# 1  A  C NA 
# 2  A  D NA 
# 3  A  F NA 
# 4  B NA NA 
# 5  A NA NA 
# 6  B  C  G 
# 7  B  C  H 
# 8  B  C  I 
# 9  B  F  G 
# 10  B  F  H 
# 11  B  F  I 
# 12 NA  D  H 
# 13 NA  D  I 
# 14  B  E  I 

私はRに新たなんだけど、これは不格好な感じ、私が悪用してはならないことを悪用しているかどうか疑問に思います。失敗した複数の不必要な試行で何が起こっていますか?

答えて

1

this linkを確認してください。これは、複数の列がネストされていない状況を示しています。与えられたドキュメントとリンクによれば、これを行うための巧妙な方法がない限り、あいまいさを避けるために関数を1つの列に対して定義するだけかもしれません。

したがって、列を1つずつネスト解除する必要があるかもしれません。下に示すコードは、面倒であるかもしれませんが、少し単純化します。 Psidomの答えに加えて

> resp1 <- c("A", "B; A", "B", NA, "B") 
> resp2 <- c("C; D; F", NA, "C; F", "D", "E") 
> resp3 <- c(NA, NA, "G; H; I", "H; I", "I") 
> data <- data.frame(resp1, resp2, resp3, stringsAsFactors = F) 
> data 
    resp1 resp2 resp3 
1  A C; D; F <NA> 
2 B; A <NA> <NA> 
3  B C; F G; H; I 
4 <NA>  D H; I 
5  B  E  I 
library(tidyr) 
library(dplyr) 
data %>% 
transform(resp1 = strsplit(resp1, "; "), 
      resp2 = strsplit(resp2, "; "), 
      resp3 = strsplit(resp3, "; ")) %>% 
unnest(resp1) %>% unnest(resp2) %>% unnest(resp3) 
    resp1 resp2 resp3 
1  A  C <NA> 
2  A  D <NA> 
3  A  F <NA> 
4  B <NA> <NA> 
5  A <NA> <NA> 
6  B  C  G 
7  B  C  H 
8  B  C  I 
9  B  F  G 
10  B  F  H 
11  B  F  I 
12 <NA>  D  H 
13 <NA>  D  I 
14  B  E  I 
+0

最後の行は_errorを与えること:間違った結果サイズ(5)、6か1_を期待。 'unnest(resp1、resp2、resp3)'と置き換えたときと同じです。 – alexpghayes

+0

うーん、興味深い。コードは私のために働くようです。あなたの結果を再現するコードブロック全体を貼り付けました。 – Psidom

+0

最初のコールで他のネストされた列を削除するように見えるため、ネストされていない順に動作しない同様の問題が発生しました –

0

:(行の重複が必要な場合)、デフォルトでは、unnestは、追加のリスト列をドロップ。

他の列を保持するには、.drop = FALSE引数を使用します。

ラインunnest(resp1) %>% unnest(resp2) %>% unnest(resp3)は次のようになります。

unnest(resp1, .drop = FALSE) %>% unnest(resp2, .drop = FALSE) %>% unnest(resp3) 
関連する問題