首页 文章

使用未定义的列子集化向量

提问于
浏览
-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

2 回答

  • 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
    
  • 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
    

相关问题