我有一个不同长度的矢量列表。 第一列有一个整数,表示向量中的索引,我需要对向量进行子集化。
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
答案 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