2

次の最初の2つの列を持つマトリックスがあります:場所、年。この後に、暦日に1つずつ、合計50の列が続きます。日の列には、場所が訪問されなかった場合は「NA」、場所が訪問された場合は1が表示されます。

例:

Location Year 1  2  3  4  5  6  7 8  9  10 .... 50
Site1    2005 NA NA NA 1  NA NA 1 NA NA 1  .... NA
Site2    2006 NA NA 1  NA NA NA 1 NA NA 1  .... NA

以前、reshapeパッケージを使用して、4次元の行列を作成しました。データフレームの各列は、配列を溶かしてキャストするための変数として使用されます。しかし、ここでは複数の列があり、うまく機能していないようです。

以下を作成したいと思います。

dim Y: locations
dim X: days 1-50
dim Z: Years

これは、毎年データを抽出し、各場所を日配列ごとに積み重ねるようなものです。この方法で3次元配列を作成するための最良の方法を知っている人はいますか?

ありがとう。

4

3 に答える 3

0

ライブラリをよりクリーンに処理する方法があるかもしれませんが、reshape2lapplyを使用するとクリーンなリストが得られます。配列として必要な場合は、次のように変換してください

arr <- lapply(unique(dat$Location), function(L) dat[dat$Location==L, -1])

# add names, to keep it neat
names(arr) <- unique(dat$Location)

# Convert to array if needed
arr <- as.array(arr)
于 2013-02-18T00:50:49.337 に答える
0

何が必要かが明確ではありません(構造だけでなく、最終結果のいくつかの値と、作業するデータを指定します)

まず、あなたのデータを複製します

dat <- data.frame(Location =c('Site1','Site2'),
           Year=c(2005,2006))
dat <- cbind(dat,matrix(sample(c(1,NA),100,rep=T),ncol=50))

次に、これを使用しreshape2て取得します:

library(reshape2)
melt(dat,id.vars=c('Location','Year'))
    Location Year variable value
1      Site1 2005        1    NA
2      Site2 2006        1    NA
3      Site1 2005        2     1
4      Site2 2006        2    NA
5      Site1 2005        3    NA
6      Site2 2006        3     1
7      Site1 2005        4     1
8      Site2 2006        4    NA
于 2013-02-18T00:56:33.957 に答える
0

NAを削除したいと思います。

library(reshape2)

test <- read.table(text="Location Year 1  2  3  4  5  6  7 8  9  10
Site1    2005 NA NA NA 1  NA NA 1 NA NA 1
Site2    2006 NA NA 1  NA NA NA 1 NA NA 1", h=T)

melt(test, id = c("Location", "Year"), na.rm = TRUE, variable.name = "day")[, -4]

#    Location Year  day
# 6     Site2 2006   X3
# 7     Site1 2005   X4
# 13    Site1 2005   X7
# 14    Site2 2006   X7
# 19    Site1 2005  X10
# 20    Site2 2006  X10
于 2013-02-18T00:57:41.477 に答える