在矩阵/数据帧中保存不同长度的向量

时间:2014-01-21 12:46:40

标签: r

我有一个长度为166860的数字区域。它由412个不同的元素组成,大部分长度为405,有些长度为809.我有它们的开始和结束ID。

我的目标是提取它们并将它们放在一个包含412列

的矩阵/数据框架中

现在,我正在尝试这段代码:

m = matrix(NA,ncol=412, nrow=809)
for (j in 1:412){
temp.start = start.ids[j]
temp.end = end.ids[j]
m[,j] = area[temp.start:temp.end]
}

但我最终得到了这条错误消息:

“m [,j] = area [temp.start:temp.end]中的错误:   要替换的项目数量不是替换长度的倍数“

5 个答案:

答案 0 :(得分:4)

这是一个非常简单的方法:

示例数据:

area <- c(1:4, 1:5, 1:6, 1:3)
# [1] 1 2 3 4 1 2 3 4 5 1 2 3 4 5 6 1 2 3

start.ids <- which(area == 1)
# [1]  1  5 10 16

end.ids <- c(which(area == 1)[-1] - 1, length(area))
# [1]  4  9 15 18

创建一个包含单行矩阵的列表:

mats <- mapply(function(x, y) t(area[seq(x, y)]), start.ids, end.ids)
# [[1]]
#      [,1] [,2] [,3] [,4]
# [1,]    1    2    3    4
# 
# [[2]]
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    2    3    4    5
#
# [[3]]
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    1    2    3    4    5    6
# 
# [[4]]
#      [,1] [,2] [,3]
# [1,]    1    2    3

使用rbind.fill.matrix包中的plyr函数创建矩阵并转置它(t):

library(plyr)
m <- t(rbind.fill.matrix(mats))
#    [,1] [,2] [,3] [,4]
# 1    1    1    1    1
# 2    2    2    2    2
# 3    3    3    3    3
# 4    4    4    4   NA
# 5   NA    5    5   NA
# 6   NA   NA    6   NA

答案 1 :(得分:1)

您将列长度设置为412,并且矩阵的长度不能灵活/可变。这意味着您为列分配的值必须长度为412或更小,可以填充长度为412.从手册上的?矩阵:

  

如果数据中的元素太少而无法填充矩阵,则数据中的元素将被回收。如果数据长度为零,则适当类型的NA用于原子向量(0表示原始向量),NULL表示列表。

正如另一位评论者所说,您可能打算分配行,在这种情况下,m [j,]是这样做的方法,但是您必须填写您使用NA分配的值或允许NA为已填充,因此分配的值始终为809。

m = matrix(NA,ncol=412, nrow=809)
for (j in 1:412){
  temp.start = start.ids[j]
  temp.end = end.ids[j]
  val <- area[temp.start:temp.end]
  m[j, ] = c(val, rep(NA, 809 - length(val)))
}

答案 2 :(得分:1)

这个怎么样?我制作了一些样本数据:

#here are the random sets of numbers - length either 408 or 809
nums<-lapply(1:412,function(x)runif(sample(c(408,809),1)))

#this represents your numeric (one list of all the numbers)
nums.vec<-unlist(nums)

#get data about the series (which you have)
nums.lengths<-sapply(nums,function(x)length(x)) 
nums.starts<-cumsum(c(1,nums.lengths[-1]))
nums.ends<-nums.starts+nums.lengths-1


new.vec<-unlist(lapply(1:412,function(x){
    v<-nums.vec[nums.starts[x]:nums.ends[x]]
    c(v,rep(0,(809-length(v))))
}))

matrix(new.vec,ncol=412)

答案 3 :(得分:0)

怎么样?
m[j,] = area[temp.start:temp.end]

编辑:

  a <- area[temp.start:temp.end]
  m[1:length(a),j] <- a

答案 4 :(得分:0)

也许其他人有更好的答案。在我看来,你有两个选择:

  1. 将m [,j]改为m [1:length(area [temp.start:temp.end]),j]然后你不会得到错误,但你会留下一些NA。< / p>

  2. 改为使用矩阵列表,这样每个矩阵的尺寸就会不同。