去除matirx列中的连续na

去除matirx列中的连续na,r,dataframe,matrix,data.table,na,R,Dataframe,Matrix,Data.table,Na,我问了同一个问题,但它被关闭了,因为我的帖子与类似的问题关联,尽管它们与我的问题无关,也无法解决问题。 数据集: 我有一个巨大的数据集保存在一个矩阵中,其中行的数量超过一百万,有十几列 矩阵看起来像 data <- matrix(c(1, NA, 2, NA, 1, NA, NA, NA, 1, NA, 3, NA, 5, NA, NA, NA, 8, NA, 5, NA, 7, NA, NA, NA), ncol=3) > data [,1] [,2] [,3] [1,]

我问了同一个问题,但它被关闭了,因为我的帖子与类似的问题关联,尽管它们与我的问题无关,也无法解决问题。

数据集:

我有一个巨大的数据集保存在一个矩阵中,其中行的数量超过一百万,有十几列

矩阵看起来像

data <- matrix(c(1, NA, 2, NA, 1, NA, NA, NA, 1, NA, 3, NA, 5, NA, NA, NA, 8, NA, 5, NA, 7, NA, NA, NA), ncol=3)
> data
     [,1] [,2] [,3]
[1,]    1    1    8
[2,]   NA   NA   NA
[3,]    2    3    5
[4,]   NA   NA   NA
[5,]    1    5    7
[6,]   NA   NA   NA
[7,]   NA   NA   NA
[8,]   NA   NA   NA
编辑:

预期产出

         [,1] [,2] [,3]
    [1,]    1    1    8
    [2,]   NA   NA   NA
    [3,]    2    3    5
    [4,]   NA   NA   NA
    [5,]    1    5    7
   

如果是连续的,则可以使用
rle

i1 <- rowSums(is.na(data)) > 0
# // or just forgot to update here
i1 <- is.na(data[,1])

data[!inverse.rle(within.list(rle(i1), {
          values[values & lengths < 3] <- FALSE})),]
更新 如果我们有一个包含所有
NA
s的特定列,那么我们可以先删除它

data1 <- data[,colSums(!is.na(data)) != 0]

如果是连续的,则可以使用
rle

i1 <- rowSums(is.na(data)) > 0
# // or just forgot to update here
i1 <- is.na(data[,1])

data[!inverse.rle(within.list(rle(i1), {
          values[values & lengths < 3] <- FALSE})),]
更新 如果我们有一个包含所有
NA
s的特定列,那么我们可以先删除它

data1 <- data[,colSums(!is.na(data)) != 0]
如果某些列中缺少值,则其他列必然会缺少同一行的值

我认为这是非常重要的信息,我们可以利用它,只处理任何一列,而不是完整的数据集。尝试:

vec <- data[, 1]
data[!with(rle(is.na(vec)), rep(values & lengths >= 3, lengths)), ]

#     [,1] [,2] [,3]
#[1,]    1    1    8
#[2,]   NA   NA   NA
#[3,]    2    3    5
#[4,]   NA   NA   NA
#[5,]    1    5    7
vec=3,长度)),]
#     [,1] [,2] [,3]
#[1,]    1    1    8
#[2,]NA-NA
#[3,]    2    3    5
#[4,]NA-NA
#[5,]    1    5    7
如果某些列中缺少值,则其他列必然会缺少同一行的值

我认为这是非常重要的信息,我们可以利用它,只处理任何一列,而不是完整的数据集。尝试:

vec <- data[, 1]
data[!with(rle(is.na(vec)), rep(values & lengths >= 3, lengths)), ]

#     [,1] [,2] [,3]
#[1,]    1    1    8
#[2,]   NA   NA   NA
#[3,]    2    3    5
#[4,]   NA   NA   NA
#[5,]    1    5    7
vec=3,长度)),]
#     [,1] [,2] [,3]
#[1,]    1    1    8
#[2,]NA-NA
#[3,]    2    3    5
#[4,]NA-NA
#[5,]    1    5    7

谢谢您的回答。你认为这可能是对数百万数据集最有效的方法吗?@Jean我在发布答案后看到了你的更新。最初,它使用
apply
在行上循环。现在,如果一行中有任何一行是NA,那么在您的条件下,可以选择第一行并使用
is.NA
检查NA,或者在is.NA上使用
rowSums
。在逻辑向量上应用
rle
,以根据
长度
条件对数据进行子集。感谢您的更新。如果只有一列包含连续缺少的值,而其他列不包含,该怎么办?@Jean你能检查我的更新眼吗谢谢你的回答。你认为这可能是对数百万数据集最有效的方法吗?@Jean我在发布答案后看到了你的更新。最初,它使用
apply
在行上循环。现在,如果一行中有任何一行是NA,那么在您的条件下,可以选择第一行并使用
is.NA
检查NA,或者在is.NA上使用
rowSums
。在逻辑向量上应用
rle
,以根据
长度
条件对数据进行子集。感谢您的更新。如果只有一列包含连续缺少的值,而其他列不包含,该怎么办?@Jean你能检查我的更新眼吗非常感谢,这个答案也存档了目标。非常感谢,这个答案也存档了目标。
library(data.table)
data[as.data.table(data)[, .I[!(.N >=3 & is.na(V1))], 
             rleid(is.na(V1))]$V1,]
vec <- data[, 1]
data[!with(rle(is.na(vec)), rep(values & lengths >= 3, lengths)), ]

#     [,1] [,2] [,3]
#[1,]    1    1    8
#[2,]   NA   NA   NA
#[3,]    2    3    5
#[4,]   NA   NA   NA
#[5,]    1    5    7