2016-12-16 10 views
0

spread()関数がキー列に重複して機能するようにしようとしています - これは前に説明したが、それを稼働させるためには、私は一日のうちにもっと良い部分を費やしてきました。R重複を含むスプレッド機能 - 一時的な行を追加した後も動作しません。

私は2列のデータを持っています。最初の列「雪の日」は、冬のシーズンの最初の日を表し、対応する積雪深度は「深度」列にあります。これは数年間のデータ(〜62歳)です。そうそこが最初の 62年でなければならない、第二、このカラム・snowdayための第三等日snowdayにおける重複を生成する:

snowday row depth 
     1 1  0 
     1 2  0 
     1 3  0 
     1 4  0 
     1 5  0 
     1 6  0 
... 

     75 4633 24 
     75 4634  4 
     75 4635  6 
     75 4636 20 
     75 4637 29 
     75 4638  1 

Iは、データフレームをより過渡にするために、「行」欄を追加しました(私は漠然とであることを理解しているので、1 hones:総測定は、年間75日で62年〜引き継がれる4638行を今私は広い、それを広めたいのですが:

wide <- spread(seasondata, key = snowday, value = depth, fill = 0) 

と私はすべてゼロを取得します:

row 1 2 3 4 5 6 7 8 9 10 11 12 13 14 
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

私はそれがこのようなものであることを望みます(列は "雪の日"によって定義され、行の値はその特定の日に様々な年に記録されたさまざまな深度です。日〜11 1:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 
    2 1 3 4 0 0 1 0 2 8 9 19 0 3 
    0 8 0 0 0 4 0 6 6 0 1 0 2 0 
    3 5 0 0 0 2 0 1 0 2 7 0 12 4 

私は基本的に私は、ドロップ= TRUEて作業しようとしたか= TRUEの変換、および出力値がどのように応じて、すべてがゼロまたはNAのいずれかでありましたhere-何かが欠けていると思いますティンカー。また、data.frame(seasondata)の値はすべて整数です。何かご意見は?

+0

私はかなり簡単な修正のようです...私はちょうど右の値出力が届かない推測に検索語を熟読しましたが、私はいくつかの簡単なステップが欠落しています。しかし、検索が圧倒的になる可能性がありますが、配布資料を要求するのではなく、掘り続けていくことが重要です(これは私たちが正しいことを学ぶ方法です...)。 – user5691676

答えて

0

depthカラムをsnowdayの値に従って分割してから、すべての75個のカラムをまとめてバインドすることです。

62 * 75が4638でないという合併症があるので、私は数年間で75の雪の日は観測しないと仮定します。つまり、75の列(雪の日)の中には62の観測値を持たないものもあります。短い列をNA秒で埋めることで、75列すべてが62項目の長さになるようにします。

例として、偽のデータを作成します。私たちは、snowdays 1および2のためのデータの3「年」を確認したが、わずか2 snowdays 3のデータの「年」と4

set.seed(1) 
seasondata <- data.frame(
    snowday = c(rep(1:2, each = 3), rep(3:4, each = 2)), 
    depth = round(runif(10, 0, 10), 0)) 
# snowday depth 
# 1  1  3 
# 2  1  4 
# 3  1  6 
# 4  2  9 
# 5  2  2 
# 6  2  9 
# 7  3  9 
# 8  3  7 
# 9  4  6 
# 10  4  1 

私たちは、最初の列がどうあるべきか、長い見つけ出します。あなたの場合、m == 62。私の例では、m == 3(データの年)です。

m <- max(table(seasondata$snowday)) 

今、私たちは一緒にすべての列をsnowdaysの値によってdepthを分割し、NASとの短い列を入力し、最後にcbindするby機能を使用します。spreadを使用して

out <- do.call(cbind, 
    by(seasondata$depth, seasondata$snowday, 
    function(x) { 
     c(x, rep(NA, m - length(x))) 
    } 
) 
) 
out 
#  1 2 3 4 
# [1,] 3 9 9 6 
# [2,] 4 2 7 1 
# [3,] 6 9 NA NA 

ご希望の場合はspreadをご利用いただけます。この場合、rowを正しく定義する必要があります。また、今

seasondata$row <- unlist(sapply(rle(seasondata$snowday)$lengths, seq_len)) 
seasondata 
# snowday depth row 
# 1  1  3 1 
# 2  1  4 2 
# 3  1  6 3 
# 4  2  9 1 
# 5  2  2 2 
# 6  2  9 3 
# 7  3  9 1 
# 8  3  7 2 
# 9  4  6 1 
# 10  4  1 2 

等、第二snowdayための第二snowday 1、2であるべきであるrow等まず、第1 snowday 1(snowday == 1)、第1、第2 snowday 2、rowなければなりません我々はspreadを使用することができます。

library(tidyr) 
spread(seasondata, key = snowday, value = depth, fill = NA) 
# row 1 2 3 4 
# 1 1 3 9 9 6 
# 2 2 4 2 7 1 
# 3 3 6 9 NA NA 
+0

これは本当にありがとう!それを修正するには数日間さまざまな方法を試してきましたが、無駄です。良い経験は、さまざまな機能やテクニックに晒されていました。再度、感謝します! do.call()への公開は非常に便利です! – user5691676

関連する問題