使用未定义列子集向量

时间:2013-05-07 18:50:54

标签: r

我有一个不同长度的矢量列表。 第一列有一个整数,表示向量中的索引,我需要对向量进行子集化。

v1 <- c(6,1,2,3,4,5,6,7,8,9,10)
v2 <- c(5,1,2,3,4,5)
v3 <- c(3,1,2,3,4,5,6,7,8,9,10,11,12,13)

我需要对两侧索引值周围的两个位置进行子集化,包括索引位置。 例如,在第一个向量中,索引是6,所以我需要第4到第8个位置。

当索引太靠近向量的末尾并且出现“未定义列选择”错误时,会出现问题。我想对列表中的所有向量进行子集化,并将它们放在一个数据帧中,未定义的列被NA替换,以便它看起来像这样:

  X1 X2 X3 X4 X5
   3  4  5  6  7
   2  3  4  5 NA
  NA  1  2  3  4

总体目标是对列进行各种汇总统计,缺失值也可以。

编辑:

每个向量的第一个元素不是我试图操作的数据的一部分。它只是一个索引,告诉我在向量的其余部分中将数据子集在哪里。

第一个元素永远不是1.最低元素是2,最高元素取决于向量的长度。以下是使用相同数据的一些其他示例,但更改第一个元素以显示这将如何影响子集。

x1 <- c(2,1,2,3,4,5)

X1 X2 X3 X4 X5
NA NA  1  2  3

x2 <- c(3,1,2,3,4,5)

X1 X2 X3 X4 X5
NA  1  2  3  4

x3 <- c(4,1,2,3,4,5)

X1 X2 X3 X4 X5
 1  2  3  4  5

x4 <- c(5,1,2,3,4,5)

X1 X2 X3 X4 X5
 2  3  4  5 NA

x5 <- c(6,1,2,3,4,5)

X1 X2 X3 X4 X5
 3  4  5 NA NA

2 个答案:

答案 0 :(得分:1)

t( sapply(list(v1,v2,v3), function(v) v[ (v[1]-2):(v[1]+2) ] ) )
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    4    5    6    7
[2,]    2    3    4    5   NA
[3,]    3    1    2    3    4

我认为您在描述任务时遇到问题,因为第三行中的NA与描述不符,尤其是在您的评论之后。如果您更改问题以便合理地获得第三行(当前不正确),那么您需要使用左NA填充向量:

v1 <- c(6,1,2,3,4,5,6,7,8,9,10)
v2 <- c(5,1,2,3,4,5)
v3 <- c(2,1,2,3,4,5,6,7,8,9,10,11,12,13)
t( sapply(list(v1,v2,v3), function(v) c( rep(NA, max(0,3-v[1])), v[ (v[1]-2):(v[1]+2) ] ) ) )
     [,1] [,2] [,3] [,4] [,5]
[1,]    3    4    5    6    7
[2,]    2    3    4    5   NA
[3,]   NA    2    1    2    3

答案 1 :(得分:1)

mylist <- list(v1 <- c(6,1,2,3,4,5,6,7,8,9,10),
               v2 <- c(5,1,2,3,4,5),
               v3 <- c(3,1,2,3,4,5,6,7,8,9,10,11,12,13))

res <- sapply(mylist,function(x) {
  ind <- max(2,x[1]-2):min(length(x),x[1]+2)
  res <- rep(NA,5)
  res[ind-x[1]+3] <- x[ind]
  res
})

t(res)

#       [,1] [,2] [,3] [,4] [,5]
# [1,]    3    4    5    6    7
# [2,]    2    3    4    5   NA
# [3,]   NA    1    2    3    4