-1

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

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
4

2 回答 2

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
于 2013-05-07T19:02:35.100 回答
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
于 2013-05-07T19:25:59.803 回答