去除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