我想删除一列中连续超过3个NA
的行。
[,1] [,2]
[1,] 1 1
[2,] NA 1
[3,] 2 4
[4,] NA 3
[6,] 1 4
[7,] NA 8
[8,] NA 5
[9,] NA 6
所以我有这个数据
[,1] [,2]
[1,] 1 1
[2,] NA 1
[3,] 2 4
[4,] NA 3
[6,] 1 4
我做了一项研究,我尝试了这段代码
data[! rowSums(is.na(data)) >3 , ]
但我认为这只用于连续NA
个连续。
答案 0 :(得分:9)
如上所述,rle
是一个很好的起点:
is.na.rle <- rle(is.na(data[, 1]))
由于NAs只有三个或更多时才“坏”,我们可以重写这些值:
is.na.rle$values <- is.na.rle$values & is.na.rle$lengths >= 3
最后,使用inverse.rle
构建要过滤的索引向量:
data[!inverse.rle(is.na.rle), ]
答案 1 :(得分:3)
你可以使用rle
,或者你可以这样做:
library(data.table)
d = data.table(a = c(1,NA,2,NA,3,4,NA,NA,NA), b = c(1:9))
d[d[, if(.N > 3) {.I[1]} else {.I}, by = cumsum(!is.na(a))]$V1]
# a b
#1: 1 1
#2: NA 2
#3: 2 3
#4: NA 4
#5: 3 5
#6: 4 6
运行d[, cumsum(!is.na(a))]
以查看其工作原理。另外,我可以使用.SD
代替.I
来获得更清晰的代码,但却选择了效率。
答案 2 :(得分:2)
正如@DirkEddelbuettel建议的那样,rle()
功能会有所帮助。您可以创建自己的函数来标识具有3个或更多连续NA值的矢量元素。
consecna <- function(x, n=3) {
# function to identify elements with n or more consecutive NA values
y <- rle(is.na(x))
y$values <- y$lengths > (n - 0.5) & y$values
inverse.rle(y)
}
然后,您可以将此函数应用于矩阵的每一列。
# example matrix of data
m <- matrix(c(1, NA, 2, NA, 1, NA, NA, NA, 1, 1, 4, 3, 4, 8, 5, 6), ncol=2)
# index matrix identifying elements with 3 or more consecutive NA values
mindex <- apply(m, 2, consecna)
然后使用创建的索引矩阵去除所有已识别的行。
# removal of all the identified rows
m2 <- m[!apply(mindex, 1, any), ]