2016-05-25 6 views
1

簡単な質問を逆転(または溶液見つける)ことができません:私はこれを逆にし、元DFの裏を取得できますかRは - 私は自分自身を解決することができませんでした溶融

df <- data.frame(A1 = sample(1:100, 10, replace = TRUE), A2 = sample(1:100, 10, replace = TRUE)) 
molten <- melt(df) 

を?私のためには、キャストもキャストも機能しません。

+0

http://stackoverflow.com/questions/25935706シーケンス列を作成した後tidyrからspreadです/ how-to-unmelt-data-with-reshape-r – user20650

+0

私の答えはうまくいきますか、それともあなたが既に溶融状態にあるのでしょうか? – lmo

+0

それはうまくいくだろうが、user20650によってコメントされているように - 私はすでにdfを持たずに溶融状態になっている。 –

答えて

1

あなたは溶融状態に既にある場合は、最初の変数

df$id <- 1:nrow(df) 
molten <- melt(df, id.var="id") 
dcast(molten, id~variable) 

を構築し、ID場合は、行が適切にソートされていることを、あなたの例からの通知、動作します。あなたはrepでIDを構築するためにこれを利用することができます

molten$id <- rep(1:(nrow(molten)/2), 2) 

そして、上記dcast方法で動作します。もちろん、溶かされた変数は3つ以上あるかもしれません。このIDの作成は、2つのかなり大規模な仮定に依存していることを

molten$id <- rep(1:(nrow(molten)/length(unique(variable))), 
       length(unique(variable))) 

注:

  1. データの作成者は、元の順序を台無し方法でデータをソートしていなかった次のようにrepを一般化することができます。
  2. meltの欠損値は削除されませんでした。

tableを使用して2番目の問題を部分的にテストできます。 「可変」のすべてのレベルが同じ長さであることを視覚的にチェックする。これは愚かな証拠ではありませんが、かなり良い指標です。

+1

ありがとう@ user20650。このシナリオを下に追加しましたが、一般化すると思います。 – lmo

+0

しかし、グッドなことには、各グループに番号が不揃いであれば問題になるかもしれないと思います(溶融の後に試してみてください)。 私の気持ちは 'ave'と' seq_along'と一緒に行く感じです。 – user20650

+0

私は同意します。しかし、その時点では、「ワイド」操作の観察結果を一致させることは不可能ではないにしても、困難である。溶かしたデータを作成したユーザーが表示される前にすべてのNAsを削除した場合、この操作は危険です。たぶん私はそれを言及する必要があります。 – lmo

1

これは簡単にunstack

unstack(molten, value~variable) 
# A1 A2 
#1 49 46 
#2 51 75 
#3 41 27 
#4 75 4 
#5 91 79 
#6 19 87 
#7 24 18 
#8 96 57 
#9 87 42 
#10 8 47 

で行うことができるか、別のオプションは、

library(dplyr) 
library(tidyr) 
molten %>% 
    group_by(variable) %>% 
    mutate(n = row_number()) %>% 
    spread(variable, value) %>% 
    select(-n)  
#  A1 A2 
# <int> <int> 
#1  49 46 
#2  51 75 
#3  41 27 
#4  75  4 
#5  91 79 
#6  19 87 
#7  24 18 
#8  96 57 
#9  87 42 
#10  8 47 
+0

最初のものは等しい長さの変数でしか動作しませんが、2番目のものはうまく動作します! –

+0

@GeoVoglerはい、そうです。あなたの例は等しい長さに基づいていました。それが私が 'unstack'を追加した理由です – akrun

関連する問題