3

Rに3x168のデータフレームがあります。各行には、Day、Hour、valueの3つの列があります。曜日と時間は曜日に対応し、時間の列はその日の時間に対応し、値は私が関係する値に対応します。

このデータを、特定の日に対応する行(または列)と特定の時間に対応する列(または行)を持つ24時間365日のマトリックスに存在するように変換したいと考えています。

Rでこれを行う最も効率的な方法は何ですか?厄介なコマンドの文字列をまとめて何かを近づけることができましたが、非常に効率的な解決策があると感じています。

開始データの例:

> print(data)
    weekday hour       value
1         M    1  1.11569683
2         M    2 -0.44550495
3         M    3 -0.82566259
4         M    4 -0.81427790
5         M    5  0.08277568
6         M    6  1.36057839
...
156      SU   12  0.12842608
157      SU   13  0.44697186
158      SU   14  0.86549961
159      SU   15 -0.22333317
160      SU   16  1.75955163
161      SU   17 -0.28904472
162      SU   18 -0.78826607
163      SU   19 -0.78520233
164      SU   20 -0.19301032
165      SU   21  0.65281161
166      SU   22  0.37993619
167      SU   23 -1.58806896
168      SU   24 -0.26725907

私は次のタイプのものを手に入れたいと思っています:

   M          .... SU
1  1.11569683
2  -0.44550495
3  -0.82566259
4  -0.81427790
5
6
. 
.
.
19
20
21                 0.65281161
22                 0.37993619
23                -1.58806896
24                -0.26725907

この方法で実際のサンプルデータを取得できます。

weekday <- rep(c("M","T","W","TH","F","SA","SU"),each=24)
hour <- rep(1:24,7)
value <- rnorm(24*7)
data <- data.frame(weekday=weekday, hour=hour, value=value)

ありがとう!

4

3 に答える 3

3

このようなもの(dfrmがデータオブジェクトであると仮定):

 M <- matrix( NA, nrow=24, ncol=2, 
         dimnames = list(Hours = 1:24, Days=unique(dfrm$weekday) ) )
 M[ cbind(dfrm$hour, dfrm$weekday) ] <- dfrm$value

> M
     Days
Hours           M         SU
   1   1.11569683         NA
   2  -0.44550495         NA
   3  -0.82566259         NA
   4  -0.81427790         NA
   5   0.08277568         NA
   6   1.36057839         NA
   7           NA         NA
   8           NA         NA
   9           NA         NA
   10          NA         NA
   11          NA         NA
   12          NA  0.1284261
   13          NA  0.4469719
   14          NA  0.8654996
   15          NA -0.2233332
   16          NA  1.7595516
   17          NA -0.2890447
   18          NA -0.7882661
   19          NA -0.7852023
   20          NA -0.1930103
   21          NA  0.6528116
   22          NA  0.3799362
   23          NA -1.5880690
   24          NA -0.2672591

または、値が「密」である場合は、単に「値を折りたたむ」ことができます。

 M <- matrix(dfrm$value, 24, 7)

次に、それに応じてディメンションの名前を変更します。実際のテストケースが提供されたときに提供されたテスト済みコード。

于 2013-02-20T23:56:03.850 に答える
3

reshape2これは、パッケージでは非常に簡単です。

# Sample data - please include some with your next question!
x <- data.frame(day = c(rep("Sunday", 24),
                        rep("Monday", 24),
                        rep("Tuesday", 24),
                        rep("Wednesday", 24),
                        rep("Thursday", 24),
                        rep("Friday", 24),
                        rep("Saturday", 24)),

                hour = rep(1:24, 7),

                value = rnorm(n = 24 * 7)

)


library(reshape2)

# For rows representing hours
acast(x, hour ~ day) 

# For rows representing days
acast(x, day ~ hour) 

# If you want to preserve the ordering of the days, just make x$day a factor
# unique(x$day) conveniently gives the right order here, but you'd always want
# check that (and make sure the factor reflects the original value - that's why
# I'm making a new variable instead of overwriting the old one)
x$day.f <- factor(x$day, levels = unique(x$day))

acast(x, hour ~ day.f)
acast(x, day.f ~ hour)

使用している3列のデータセットは、「溶融データ」と呼ばれるものの例です。各行は、x$value1つ以上の識別子(ここでは、)を持つ単一の結果()をx$day表しx$hourます。内部の小さな数式をacast使用すると、新しいデータセットをどのように構成するかを表すことができます。チルダの左側の変数名は行の定義に使用され、右側の変数名は列の定義に使用されます。この場合、残りの列は1つだけx$valueなので、結果を入力するために自動的に使用されmatrixます。

そのすべてに頭を悩ませるのに少し時間がかかりましたが、データの再形成について考えることは非常に強力です。

于 2013-02-20T23:57:24.013 に答える
1

xtabsこれは、ベースRでは非常に簡単です。

output <- as.data.frame.matrix(xtabs(value ~ hour + weekday, data))
head(output)
#            SU          M           T           W         TH           F         SA
# 1 -0.56902302 -0.4434357 -1.02356300 -0.38459296  0.7098993 -0.54780300  1.5232637
# 2  0.01023058 -0.2559043 -2.79688932 -1.65322029 -1.5150986  0.05566206 -0.6706817
# 3  0.18461405  1.2783761 -0.02509352 -1.36763623 -0.4978633  0.20300678  1.4211054
# 4  0.54194889  0.5681317  0.69391876 -1.35805959  0.4208977  1.65256590  0.3622756
# 5 -1.68048536 -1.9274994  0.24036908 -0.21959772  0.7654983  1.62773579  0.6760743
# 6 -1.39398673  1.7251476  0.36563174  0.04554249 -0.2991433 -1.47331314 -0.7647513

(上記のように)正しい順序で日を取得するには、次の手順を実行する前にfactor「weekday」変数を使用します。xtabs

data$weekday <- factor(data$weekday, 
                       levels = c("SU", "M", "T", "W", "TH", "F", "SA"))
于 2013-02-21T04:50:01.163 に答える