在指定时间段内为矩阵格式的所有单元格分配单个值

时间:2014-05-30 04:31:15

标签: arrays r matrix

我有以下示例数据集,其中包含每次检查网捕获的鱼数。不以均匀的间隔检查蚊帐。检查当天在朱利安天表示,以及自上次检查以来网捕鱼的天数(或自第一次检查以来的部署)

http://textuploader.com/9ybp

Site_Number Check_Day_Julian    Set_Duration_Days   Fish_Caught
2   5   3   100
2   10  5   70
2   12  2   65
2   15  3   22
100 4   3   45
100 10  6   20
100 18  8   8
450 10  10  10
450 14  4   4

无论如何,我想将上面的原始数据转换成以下格式:

http://textuploader.com/9y3t

    1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18
2   0   0   100 100 100 70  70  70  70  70  65  65  22  22  22  0   0   0
100 0   45  45  45  20  20  20  20  20  20  8   8   8   8   8   8   8   8
450 10  10  10  10  10  10  10  10  10  10  4   4   4   4   0   0   0   0

这是一个矩阵,用于将期间捕获的鱼的数量分配给该期间内的每一天。矩阵的列是Julian天,行是站点编号。

我试图用一些矩阵函数来做这个但是我在尝试填充时间段内的所有字段时遇到了很多困难,但我不一定有一行数据?

我在这里发布了一小段代码,但经过反思,我的方法相当陈旧,有点偏离。任何人都可以建议一种方法将数据转换为提供的矩阵吗?我整天都在摸着头,一直在谷歌上搜索,但现在我很难过。

干杯, ç

2 个答案:

答案 0 :(得分:2)

两个答案,第二个答案更快,但有点低。

解决方案#1:

library(IRanges)
with(d, {
  ir <- IRanges(end=Check_Day_Julian, width=Set_Duration_Days)
  cov <- coverage(split(ir, Site_Number),
                  weight=split(Fish_Caught, Site_Number),
                  width=max(end(ir)))
  do.call(rbind, lapply(cov, as.vector))
})

解决方案#2:

with(d, {
  ir <- IRanges(end=Check_Day_Julian, width=Set_Duration_Days)
  site <- factor(Site_Number, unique(Site_Number))
  m <- matrix(0, length(levels(site)), max(end(ir)))
  ind <- cbind(rep(site, width(ir)), as.integer(ir))
  m[ind] <- rep(Fish_Caught, width(ir))
  m              
})

答案 1 :(得分:0)

我在这里看不到超级明显的矩阵变换。这就是假设原始数据位于名为dd

的data.frame中
dd$Site_Number<-factor(dd$Site_Number)

mm<-matrix(0, nrow=nlevels(dd$Site_Number), ncol=18)
for(i in 1:nrow(dd)) {
    mm[as.numeric(dd[i,1]), (dd[i,2]-dd[i,3]):dd[i,2] ] <- dd[i,4]
}
mm