Как выбрать столбцы, если в последних n наблюдениях нет NA?Как отбросить столбцы, если существует более x соседних наблюдений NA? - PullRequest
0 голосов
/ 11 июля 2019

Мне нужно следующее:

1) Сохраняйте столбцы, если: i) последние n наблюдений (n = 3) не являются NA, ii) нет вообще NA, iii) в обратном направлении отпоследние NA, есть не более 3 соседних наблюдений NA

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, С и D.

1 Ответ

0 голосов
/ 11 июля 2019

Мы можем использовать 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))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...