gpt4 book ai didi

使用 R 中的条件减少列数

转载 作者:行者123 更新时间:2023-12-04 21:06:02 27 4
gpt4 key购买 nike

我有一个超过 1000 行和 100 列的大矩阵。在每一行中只有 6-10 列有值,其余的都是零。我想创建一个只有 5 列的矩阵,这些列采用每行中 5 个连续列的值。例如:

A = structure(c(0, 1L, 6L, 0, 2L, 0, 2L, 0, 1L, 4L, 1L, 3L, 7L, 2L, 6L, 2L, 4L, 0, 3L, 0, 3L, 5L, 1L, 4L, 0, 4L, 6L, 2L, 0, 0, 5L, 0, 3L, 5L, 0, 0, 0, 4L, 6L, 7L, 0, 7L, 5L, 7L, 8L, 6L, 0, 0, 8L, 9L, 0, 0, 0, 9L, 1L, 0 , 0, 0, 0, 2L, 7L, 0, 2L, 0, 0, 1L, 8L, 4, 0, 0), .Dim = c(5L, 14L))

#A =
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
#[1,] 0 0 1 2 3 4 5 0 0 6 0 0 7 1
#[2,] 1 2 3 4 5 6 0 0 7 0 0 0 0 8
#[3,] 6 0 7 0 1 2 3 4 5 0 0 0 2 4
#[4,] 0 1 2 3 4 0 5 6 7 8 9 0 0 0
#[5,] 2 4 6 0 0 0 0 7 8 9 1 2 0 0

我想要这个矩阵:
B = structure(c(1L, 1L, 1L, 5L, 7L, 2L, 2L, 2L, 6L, 8L, 3L, 3L, 3L, 7L, 9L, 4L, 4L, 4L, 8L, 1L, 5L, 5L, 5L, 9L, 2L), .Dim = c(5L, 5L))


#B =
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 2 3 4 5
#[3,] 1 2 3 4 5
#[4,] 5 6 7 8 9
#[5,] 7 8 9 1 2

我的代码:
df = data.frame(A)
B = do.call(rbind, lapply(1:NROW(df), function(i) df[i,][(df[i,])!=0][1:5]))
# or
B = t(apply(X = df, MARGIN = 1, function(x) x[x!=0][1:5]))

我的代码对 A 的前两行工作正常,但对其余行失败。我还考虑过获取非零的列索引,然后查看是否有 5 个连续的列(它们之间没有任何间隙)并检索它们的值。非常感谢任何帮助!

最佳答案

这是一个使用 rle 的选项

t(apply(A, 1, function(x) {
rl <- rle(x !=0)
head(x[inverse.rle(within.list(rl, values[!(values & lengths >= 5)] <- FALSE))], 5)}))
# [,1] [,2] [,3] [,4] [,5]
#[1,] 1 2 3 4 5
#[2,] 1 2 3 4 5
#[3,] 1 2 3 4 5
#[4,] 5 6 7 8 9
#[5,] 7 8 9 1 2

关于使用 R 中的条件减少列数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738103/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com