我有一个长度为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]中的错误: 要替换的项目数量不是替换长度的倍数“
答案 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)
也许其他人有更好的答案。在我看来,你有两个选择:
将m [,j]改为m [1:length(area [temp.start:temp.end]),j]然后你不会得到错误,但你会留下一些NA。< / p>
改为使用矩阵列表,这样每个矩阵的尺寸就会不同。