以下の「入力」に示す画像のようなデータフレームがあります。
行ごとに1つの日付を取得しようとしています(下の「目的の出力」の図を参照)。言い換えれば、私は各行に対して一種の「転置」を行おうとします。
「LC」と「Prod」の組み合わせが一意のキーであることを規定しましょう。
入力
必要な出力:
情報:
私の実際のデータセットでは、数量フィールド(色付きの領域領域)にいくつかの欠落値があります。したがって、欠測値を使用して計算できるはずです。
失敗した私の試み
私は以下を試しましたが失敗します...
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))
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
数値以外で始まる列名を使用することをお勧めします。による ?gather
、...
は、その名前を使用して列を選択するために指定します。ここでは、数字で始まる列、つまり日付列に関心があるため、matches
を使用し、正規表現を指定してこれらの列を選択できます。
library(dplyr)
library(tidyr)
inputTest %>%
tbl_df %>%
gather(date, value, matches("^\\d+") )