web-dev-qa-db-ja.com

r dplyr'gather '関数を使用する

以下の「入力」に示す画像のようなデータフレームがあります。

行ごとに1つの日付を取得しようとしています(下の「目的の出力」の図を参照)。言い換えれば、私は各行に対して一種の「転置」を行おうとします。

「LC」と「Prod」の組み合わせが一意のキーであることを規定しましょう。

入力

enter image description here

必要な出力:

enter image description here

情報:

私の実際のデータセットでは、数量フィールド(色付きの領域領域)にいくつかの欠落値があります。したがって、欠測値を使用して計算できるはずです。

失敗した私の試み

私は以下を試しましたが失敗します...

library("dplyr")
outputTest <- tbl_df(inputTest) %>%
  gather(date, value, c(inputTest$LC, inputTest$Prod))

outputTest

出典:

inputTest <- structure(list(LC = structure(c(1L, 3L, 1L, 2L), .Label = c("berlin", 
                                                            "munchen", "stutgart"), class = "factor"), Prod = structure(c(1L, 
                                                                                                                          2L, 2L, 1L), .Label = c("(STORE1)400096", "STORE2_00154"), class = "factor"), 
               PROD_TYPE = structure(c(1L, 2L, 2L, 1L), .Label = c("STORE1", 
                                                                   "STORE2"), class = "factor"), X2015.6.29 = c(20.08, 8.91, 
                                                                                                                11.38, 15.42), X2015.7.6 = c(20.66, 8.49, 10.91, 15.57), 
               X2015.7.13 = c(19.02, 8.55, 10.89, 14.6), X2015.7.20 = c(18.6, 
                                                                        7.95, 10.58, 14.31)), .Names = c("LC", "Prod", "PROD_TYPE", 
                                                                                                         "2015.6.29", "2015.7.6", "2015.7.13", "2015.7.20"), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                     -4L))
4
S12000

Collectを使用すると、収集したくない列を否定演算子「-」(マイナス記号)で指定できます。あなたの場合のキーは日付であり、値は値であり、LC、Prod、およびPROD_TYPEは識別子として機能します。

output <- as.data.frame(inputTest) %>%
        tidyr::gather(key = Date, value = Value, -LC, -Prod, -PROD_TYPE)

これにより、次の結果が得られます。

         LC           Prod PROD_TYPE      Date Value
1    berlin (STORE1)400096    STORE1 2015.6.29 20.08
2  stutgart   STORE2_00154    STORE2 2015.6.29  8.91
3    berlin   STORE2_00154    STORE2 2015.6.29 11.38
4   munchen (STORE1)400096    STORE1 2015.6.29 15.42
5    berlin (STORE1)400096    STORE1  2015.7.6 20.66
6  stutgart   STORE2_00154    STORE2  2015.7.6  8.49
7    berlin   STORE2_00154    STORE2  2015.7.6 10.91
8   munchen (STORE1)400096    STORE1  2015.7.6 15.57
9    berlin (STORE1)400096    STORE1 2015.7.13 19.02
10 stutgart   STORE2_00154    STORE2 2015.7.13  8.55
11   berlin   STORE2_00154    STORE2 2015.7.13 10.89
12  munchen (STORE1)400096    STORE1 2015.7.13 14.60
13   berlin (STORE1)400096    STORE1 2015.7.20 18.60
14 stutgart   STORE2_00154    STORE2 2015.7.20  7.95
15   berlin   STORE2_00154    STORE2 2015.7.20 10.58
16  munchen (STORE1)400096    STORE1 2015.7.20 14.31
5
willk

数値以外で始まる列名を使用することをお勧めします。による ?gather...は、その名前を使用して列を選択するために指定します。ここでは、数字で始まる列、つまり日付列に関心があるため、matchesを使用し、正規表現を指定してこれらの列を選択できます。

library(dplyr)
library(tidyr)
inputTest %>%
       tbl_df %>% 
       gather(date, value, matches("^\\d+") )
1
akrun