2

我有一个具有以下前两列的矩阵:位置,年份。接下来是 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

这几乎就像从每年中提取数据,并按天数组一个接一个地堆叠每个位置。有谁知道以这种方式创建三维数组的最佳方法是什么?

谢谢。

4

3 回答 3

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 回答
0

图书馆可能有更清洁的方法reshape2,但使用 lapply 会给你干净的列表。如果您需要它们作为数组,只需转换为

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 回答