2017-10-08 5 views
1

2つのキーと値のペアをスプレッドしようとしていますが、共通の値の列は折りたたまれません。私はそれが以前の処理と関係しているかもしれないと思うか、あるいは私が期待した結果を得るために2つ以上のキー/値のペアを散布する正しい方法を知らない可能性が高い。r行を折りたたまない複数のキー値ペアを使用するtidyverse spread()

私は、このデータセットで始めている:

library(tidyverse) 

df <- tibble(order = 1:7, 
      line_1 = c(23,8,21,45,68,31,24), 
      line_2 = c(63,25,25,24,48,24,63), 
      line_3 = c(62,12,10,56,67,25,35)) 

次収集()関数で作成された「カウント」の値の順序を定義するための2前広がりのステップがあります。

ntrl <- df %>% 
      gather(line_1, 
        line_2, 
        line_3, 
        key = "sector", 
        value = "count") %>% 
      group_by(order) %>% 
      mutate(sector_ord = row_number()) %>% 
      arrange(order, 
        sector) 

これは「カウント」変数の数値の順序を定義する第2のプリ拡散ステップである:これは、行番号を使用して変数を「カウント」の元の順序を定義する第1の予備の拡散ステップであります:

ord <- ntrl %>% 
      arrange(order, 
        count) %>% 
      group_by(order) %>% 
      mutate(num_ord = paste0("ord_", 
            row_number(), 
            sep="")) 

そして、私が使用している最終的に拡散コード:

wide <- ord %>% 
      group_by(order) %>% 
      spread(key = sector, 
        value = count) %>% 
      spread(key = num_ord, 
        value = sector_ord) 

私は何を取得していますが、このです:

私は期待してい
order line_1 line_2 line_3 ord_1 ord_2 ord_3       
1 1  23  NA  NA  1  NA  NA 
2 1  NA  63  NA  NA  NA  2 
3 1  NA  NA  62  NA  3  NA 
4 2  8  NA  NA  1  NA  NA 
5 2  NA  25  NA  NA  NA  2 
6 2  NA  NA  12  NA  3  NA 
7 3  21  NA  NA  NA  1  NA 
8 3  NA  25  NA  NA  NA  2 
9 3  NA  NA  10  3  NA  NA 
... and so on thru 21 lines accounting for all 7 "order" lines 

挙動は「順序」の欄には、以下を与えるために、同じ「順序」値であるすべての行に崩壊してしまうということです。

order line_1 line_2 line_3 ord_1 ord_2 ord_3       
1 1  23  63  62  1  3  2 
2 2  8  25  12  1  3  2 
3 3  21  25  10  2  3  1 
4 4  45  24  56  2  1  3 
... and so on, I think that paints the picture 

私は質問と回答を検討してきました重複した識別子の使用や行番号のインデックスの使用については広がっていますが、それは役に立ちません。

私はそれが二重の広がりに関係していると思いますが、私はそれをどうやって行うのか分かりません。

ありがとうございました。

答えて

3

。キーはsummarise_all(funs(.[which(!is.na(.))]))を使用して各列に非NA値のみを選択することです。

library(tidyverse) 

df2 <- df %>% 
    gather(Lines, Value, -order) %>% 
    group_by(order) %>% 
    mutate(Rank = dense_rank(Value), 
     RankOrder = paste0("ord_", row_number())) %>% 
    spread(Lines, Value) %>% 
    spread(RankOrder, Rank) %>% 
    summarise_all(funs(.[which(!is.na(.))])) 
df2 
# A tibble: 7 x 7 
    order line_1 line_2 line_3 ord_1 ord_2 ord_3 
    <int> <dbl> <dbl> <dbl> <int> <int> <int> 
1  1  23  63  62  1  3  2 
2  2  8  25  12  1  3  2 
3  3  21  25  10  2  3  1 
4  4  45  24  56  2  1  3 
5  5  68  48  67  3  1  2 
6  6  31  24  25  3  1  2 
7  7  24  63  35  1  3  2 
+0

ありがとうございましたycwは完全に機能しました。私は完全に理解しているかどうかはわかりませんが、私はそれが恒例の方法論に固執するのが好きです。私はこれをもっと研究します。再度、感謝します。 –

2

df最低料金:ソリューションは、あなたのdfを開始tidyverseを使用して

df %>% 
    gather(headers, line, -order) %>% 
    separate(headers, into = c('dummy', 'rn')) %>% 
    select(-dummy) %>% 
    group_by(order) %>% 
    mutate(ord = rank(line, ties.method='first')) %>% 
    {data.table::dcast(setDT(.), order ~ rn, value.var = c("line", "ord"))} 

# order line_1 line_2 line_3 ord_1 ord_2 ord_3 
#1:  1  23  63  62  1  3  2 
#2:  2  8  25  12  1  3  2 
#3:  3  21  25  10  2  3  1 
#4:  4  45  24  56  2  1  3 
#5:  5  68  48  67  3  1  2 
#6:  6  31  24  25  3  1  2 
#7:  7  24  63  35  1  3  2 
関連する問題