r语言 - 如果最近 n 个观测值中没有任何 NA,如何选择列?如果相邻的 NA 观测值超过 x 个,如何删除列?



我需要以下内容:

1) 在以下情况下保留列:i) 最后 n 个观测值 (n = 3) 不是 NA,ii) 根本没有 NA,iii) 从最后一个 NA 向后,相邻的 NA 观测

值不超过 3 个2) 在以下情况下删除列:i) 有 3 个或更多相邻的 NA 观测值

我想知道答案是否是使用 dplyr

一些例子:

data = data.frame(
A = c(3,3,3,3,4, rep(NA,5)),
B = c(rnorm(10)),
C = c(rep(NA,3), rnorm(7)),
D = c(rnorm(8), NA, NA)
)

我试过:

data %>% 
select_if(~sum(!is.na(.)) >= 3)
select_if(~sum(is.na(.)) > 0)

在我的示例中,我只保留 B、C 和 D。

我们可以使用tail来获取最后n条目,并删除其中allNA列。

n <- 3
library(dplyr)
data %>% select_if(~!all(is.na(tail(., n))))
#         B      C        D
#1   0.5697     NA  0.29145
#2  -0.1351     NA -0.44329
#3   2.4016     NA  0.00111
#4  -0.0392  0.153  0.07434
#5   0.6897  2.173 -0.58952
#6   0.0280  0.476 -0.56867
#7  -0.7433 -0.710 -0.13518
#8   0.1888  0.611  1.17809
#9  -1.8050 -0.934       NA
#10  1.4656 -1.254       NA

或者使用反转逻辑

data %>% select_if(~any(!is.na(tail(., n))))

对于第二个条件,

在以下情况下删除列:i) 有 3 个或更多相邻的 NA 观测值

我们可以使用rle来获取相邻值

data %>% select_if(~!any(with(rle(is.na(.)), lengths[values]) >= n))
#         B        D
#1   0.5697  0.29145
#2  -0.1351 -0.44329
#3   2.4016  0.00111
#4  -0.0392  0.07434
#5   0.6897 -0.58952
#6   0.0280 -0.56867
#7  -0.7433 -0.13518
#8   0.1888  1.17809
#9  -1.8050       NA
#10  1.4656       NA

由于我们已经有了这些函数,因此我们也可以在 base R 中使用相同的函数以及sapply

#Condition 1
data[!sapply(data, function(x) all(is.na(tail(x, n))))]
#Condition 2
data[!sapply(data, function(x) any(with(rle(is.na(x)), lengths[values]) >= n))]

最新更新