R:基于柱值创建三维矩阵
我有一个矩阵,它有以下前两列:位置,年份。然后是50列,每个日历日一列。如果未访问该位置,则“天”列为“NA”,如果未访问该位置,则为“1” 例如:R:基于柱值创建三维矩阵,r,multidimensional-array,R,Multidimensional Array,我有一个矩阵,它有以下前两列:位置,年份。然后是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 我以前使用过整形软件包来创建四维矩阵,数据
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
我以前使用过整形软件包来创建四维矩阵,数据帧中的每一列都用作一个变量来熔化然后铸造数组。但在这里,我有多个专栏,它似乎不工作
我想创建以下内容:
dim Y: locations
dim X: days 1-50
dim Z: Years
这几乎就像从每年提取数据,然后将每个位置按日数组一个接一个地堆叠起来。有人知道用这种方法创建三维阵列的最佳方法是什么吗
谢谢。使用
重塑2
库可能有更简洁的方法,但使用lappy会为您提供更简洁的列表。如果需要它们作为数组,只需将其转换为
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)
arr不清楚您想要什么(您给出了最终结果的一些值,不仅仅是结构,还有一些需要处理的数据)
首先我复制你的数据
dat <- data.frame(Location =c('Site1','Site2'),
Year=c(2005,2006))
dat <- cbind(dat,matrix(sample(c(1,NA),100,rep=T),ncol=50))
我猜您想删除NAs
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
library(重塑2)
测试谢谢里卡多,但我刚刚尝试了这个,它只是给了我一个路线列表。我需要一个实际的三维矩阵,其中行是位置,列是天数,第三维是年份。你知道我可以尝试什么吗?谢谢你的回复!这就是我最后要做的:见我上面的回答,但我最终创建了一个类似的矩阵,然后在重塑中使用cast函数来创建我所寻找的三维。谢谢
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