1

次の例のように、時系列データを含むデータ フレームがあるとします。最初の列はインデックスで、残りの列はすべて異なるデータ ストリームを含み、わかりやすい名前が付けられています。

temps = data.frame(matrix(1:20,nrow=2,ncol=10))
names(temps) <- c("flr1_dirN_areaA","flr1_dirS_areaA","flr1_dirN_areaB","flr1_dirS_areaB","flr2_dirN_areaA","flr2_dirS_areaA","flr2_dirN_areaB","flr2_dirS_areaB","flr3_dirN_areaA","flr3_dirS_areaA")
temps$Index <- as.Date(2013,7,1:2)

temps
  flr1_dirN_areaA flr1_dirS_areaA    ...       Index
1               1               3    ...  1975-07-15
2               2               4    ...  1975-07-16   

今、ggplot2 でプロットするためにデータ フレームを準備したいとflr思いdirますarea

この単純な例では、次のようにこれを実現できます。

temps.m <- melt(temps,"Index")
temps.m$flr <- factor(rep(1:3,c(8,8,4)))
temps.m$dir <- factor(rep(c("N","S"),each=2,len=20))
temps.m$area <- factor(rep(c("A","B"),each=4,len=20))
temps.m
        Index        variable value flr dir area
1  1975-07-15 flr1_dirN_areaA     1   1   N    A
2  1975-07-16 flr1_dirN_areaA     2   1   N    A
3  1975-07-15 flr1_dirS_areaA     3   1   S    A
4  1975-07-16 flr1_dirS_areaA     4   1   S    A
5  1975-07-15 flr1_dirN_areaB     5   1   N    B
6  1975-07-16 flr1_dirN_areaB     6   1   N    B
7  1975-07-15 flr1_dirS_areaB     7   1   S    B
8  1975-07-16 flr1_dirS_areaB     8   1   S    B
9  1975-07-15 flr2_dirN_areaA     9   2   N    A
10 1975-07-16 flr2_dirN_areaA    10   2   N    A
11 1975-07-15 flr2_dirS_areaA    11   2   S    A
12 1975-07-16 flr2_dirS_areaA    12   2   S    A
13 1975-07-15 flr2_dirN_areaB    13   2   N    B
14 1975-07-16 flr2_dirN_areaB    14   2   N    B
15 1975-07-15 flr2_dirS_areaB    15   2   S    B
16 1975-07-16 flr2_dirS_areaB    16   2   S    B
17 1975-07-15 flr3_dirN_areaA    17   3   N    A
18 1975-07-16 flr3_dirN_areaA    18   3   N    A
19 1975-07-15 flr3_dirS_areaA    19   3   S    A
20 1975-07-16 flr3_dirS_areaA    20   3   S    A

実際には、さまざまな長さのデータ ストリーム (列) があります。それぞれが独自のファイルから取得され、データが欠落しており、列 (ファイル) 名に 3 つ以上の要素がエンコードされているため、要素を適用するこの単純な方法ではうまくいきません。仕事。より堅牢なものが必要で、変数名をさまざまな因子に解析し、溶けたデータ フレームの因子列に入力する傾向があります。

私の最終目標は、次のようなものをプロットすることです。

ggplot(temps.m,aes(x=Index,y=value,color=area,linetype=dir))+geom_line()+facet_grid(flr~.)

複数の要因を使用して、プロットしたいものの例

reshape、reshape2、plyr、またはその他のパッケージを使用すると、1 つまたは 2 つのステートメントでこれを実行できると思いますが、melt/cast/ddply およびその他の部分に苦労しています。助言がありますか?

また、私のデータを構造化するためのまったく異なる [より良い] アプローチを提案できれば、私はすべて耳を傾けます。

前もって感謝します

4

2 に答える 2

2

いくつかの正規表現を使用して因子を作成できます。

res <- do.call(rbind,strsplit(gsub('flr([0-9]+).*dir([A-Z]).*area([A-Z])',
              '\\1,\\2,\\3',  
              temps.m$variable),
         ','))

    [,1] [,2] [,3]
 [1,] "1"  "N"  "A" 
 [2,] "1"  "N"  "A" 
 [3,] "1"  "S"  "A" 
 [4,] "1"  "S"  "A" 
 [5,] "1"  "N"  "B" 
 [6,] "1"  "N"  "B" 
 [7,] "1"  "S"  "B" 
 [8,] "1"  "S"  "B" 
 ........

列を因子に変換するには、さらに手順が必要になる場合があります。

res <- colwise(as.factor)(data.frame(res))
  X1 X2 X3
1   1  N  A
2   1  N  A
3   1  S  A
4   1  S  A
........

結果を融解したデータと組み合わせるには、使用できますcbind

 temps.m <- cbind(temps.m,res)
于 2013-07-18T00:52:37.917 に答える
1

適切にフォーマットされた一連の文字列を因子変数のデータ フレームに変換する方法を次に示します。これは、因子が で分割され_、各部分文字列の最後の文字が目的のレベルであると想定しています。

require(plyr)

v <- do.call(rbind, strsplit(as.character(temps.m$variable), "_"))

v <- alply(v, 2, function(x) {
    n <- nchar(x)
    name <- substr(x, 1, n - 1)[1]
    lev <- substr(x, n, n)
    structure(factor(lev), name=name)
})

names(v) <- sapply(v, attr, "name")

temps.m <- cbind(temps.m, as.data.frame(v))

一般性をさらに追加することは、読者の演習として残されています。

于 2013-07-18T01:25:21.623 に答える