Мы можем использовать tail
, чтобы получить последние n
записи и удалить столбцы, где all
из них NA
.
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
Так как у нас уже есть функции, мы можем использовать то же самое в базе 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))]