R контроль количества последовательных значений NA на строку кадра данных - PullRequest
3 голосов
/ 04 апреля 2020

Есть похожие вопросы, но не совсем то, что я хочу сделать.

У меня есть фрейм данных, в котором я хотел бы удалить строки, в которых есть n последовательных значений NA.

1   Manhattan   NA      2300    NA      2275    2300    
2   Manhattan   2999    2975    NA      NA      2995    
3   Manhattan   NA      NA      NA      NA      4400    
4   Manhattan   6725    6500    6750    6995    6800    
5   Brooklyn    2000    1995    1975    2000    1999    
6   Bronx       1200    3200    NA      NA      NA

У меня есть некоторый рабочий код, который удаляет n чисел от общего числа NA, но хотел бы настроить его последовательно.

delete.na <- function(df, n=0) {
  df[rowSums(is.na(df)) <= n,]
}
df <- delete.na(df,3)

Итак, в этом случае после удаления строк с 3 последовательными значениями NA у меня будет:

1   Manhattan   NA      2300    NA      2275    2300    
2   Manhattan   2999    2975    NA      NA      2995    
4   Manhattan   6725    6500    6750    6995    6800    
5   Brooklyn    2000    1995    1975    2000    1999    

1 Ответ

2 голосов
/ 04 апреля 2020

Один из вариантов - l oop по строкам, проверьте с помощью rle, чтобы получить список одинаковых значений и длин смежных элементов (здесь это логический вектор (is.na - т.е. TRUE - для NA и FALSE для не-NA), поскольку «значения» являются логическими, используйте их для подстановки «длины», проверьте, не меньше ли это all, чем 3, и используйте это в качестве индекса строки для поднабора строк

df[apply(df, 1, function(x) all(with(rle(is.na(x)), lengths[values]) <3)),]
#     city col1 col2 col3 col4 col5
#1 Manhattan   NA 2300   NA 2275 2300
#2 Manhattan 2999 2975   NA   NA 2995
#4 Manhattan 6725 6500 6750 6995 6800
#5  Brooklyn 2000 1995 1975 2000 1999

данные

df <- structure(list(city = c("Manhattan", "Manhattan", "Manhattan", 
"Manhattan", "Brooklyn", "Bronx"), col1 = c(NA, 2999L, NA, 6725L, 
2000L, 1200L), col2 = c(2300L, 2975L, NA, 6500L, 1995L, 3200L
), col3 = c(NA, NA, NA, 6750L, 1975L, NA), col4 = c(2275L, NA, 
NA, 6995L, 2000L, NA), col5 = c(2300L, 2995L, 4400L, 6800L, 1999L, 
NA)), class = "data.frame", row.names = c("1", "2", "3", "4", 
"5", "6"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...