考虑以下矩阵,
m <- matrix(letters[c(1,2,NA,3,NA,4,5,6,7,8)], 2, byrow=TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] "a" "b" NA "c" NA
## [2,] "d" "e" "f" "g" "h"
我希望获得与所有非NA元素相对应的列索引,并紧跟以下NA元素合并:
result <- c(list(1), list(2:3), list(4,5),
list(1), list(2), list(3), list(4), list(5))
有什么想法吗?
答案 0 :(得分:6)
可以使用
获得非NA元素的列(和行)指示which(!is.na(m), TRUE)
完整答案:
由于你想逐行工作,但R按列处理向量,因此更容易处理m
的转置。
t_m <- t(m)
n_cols <- ncol(m)
我们得到如上所述的数组指示,它给出了每个列表的起点。
ind_non_na <- which(!is.na(t_m), TRUE)
由于我们正在进行转置,我们需要行索引,我们需要分别处理每一列。
start_points <- split(ind_non_na[, 1], ind_non_na[, 2])
每个列表的长度由起始点之间的差异或最后一个点与行尾(+1)之间的差异给出。然后我们只需调用seq
来获取序列。
unlist(
lapply(
start_points,
function(x)
{
len <- c(diff(x), n_cols - x[length(x)] + 1L)
mapply(seq, x, length.out = len, SIMPLIFY = FALSE)
}
),
recursive = FALSE
)
答案 1 :(得分:1)
这会让你走近:
cols <- col(m)
cbind(cols[which(is.na(m))-1],cols[is.na(m)])
[,1] [,2]
[1,] 2 3
[2,] 4 5