Rozważ ramkę danych w R, w której chcę usunąć wiersz 6, ponieważ brakuje w niej obserwacji dla zmiennych zm1:zm3. Ale ramka danych zawiera ważne obserwacje dla identyfikatora i roku. Zobacz kod poniżej. W ...

3
Martien Lubberink 23 czerwiec 2021, 09:10

4 odpowiedzi

Najlepsza odpowiedź

Możemy użyć complete.cases

library(dplyr)
df %>%
    filter(if_any(var1:var3, complete.cases))

-wynik

# A tibble: 9 x 5
     id  year  var1  var2  var3
  <int> <int> <int> <int> <int>
1     1  2001    48    55    82
2     2  2002    22    83    67
3     3  2003    89    NA    19
4     4  2004    56     1    38
5     5  2005    17    58    35
6     7  2007     4    30    94
7     8  2008    NA    NA    36
8     9  2009    97   100    80
9    10  2010    37    NA    NA
3
akrun 23 czerwiec 2021, 19:15

W tym przypadku możemy również użyć pmap:

library(dplyr)
library(purrr)

df %>%
  filter(!pmap_lgl(., ~ {x <- c(...)[-c(1, 2)];
  all(is.na(x))}))

# A tibble: 9 x 5
     id  year  var1  var2  var3
  <int> <int> <int> <int> <int>
1     1  2001    90    55    77
2     2  2002    77     5    18
3     3  2003    17    NA    70
4     4  2004    72    33    33
5     5  2005    10    55    77
6     7  2007    22    81    17
7     8  2008    NA    NA    46
8     9  2009    93    28   100
9    10  2010    50    NA    NA

Lub możemy również użyć funkcji complete.cases w pmap zgodnie z sugestią drogi @akrun:

df %>% 
    filter(pmap_lgl(select(., 3:5), ~ any(complete.cases(c(...)))))
2
Anoushiravan R 23 czerwiec 2021, 19:14

Możesz użyć if_any w filter -

library(dplyr)
df %>% filter(if_any(var1:var3, Negate(is.na)))

#     id  year  var1  var2  var3
#  <int> <int> <int> <int> <int>
#1     1  2001    14    99    43
#2     2  2002    25    72    76
#3     3  2003    90    NA    15
#4     4  2004    91     7    32
#5     5  2005    69    42     7
#6     7  2007    57    83    41
#7     8  2008    NA    NA    74
#8     9  2009     9    78    23
#9    10  2010    93    NA    NA

W bazie R możemy użyć rowSums, aby wybrać wiersze, które mają co najmniej 1 wartość inną niż NA.

cols <- grep('var', names(df))
df[rowSums(!is.na(df[cols])) > 0, ]
1
Ronak Shah 23 czerwiec 2021, 06:12

Jeśli szukasz kompletnych przypadków, użyj następujących (jądro opiera się na innych odpowiedziach):

library(tidyverse)
df <- tibble(id = c(seq(1,10)), year=c(seq(2001,2010)), 
             var1 = c(sample(1:100, 10, replace=TRUE)), 
             var2 = c(sample(1:100, 10, replace=TRUE)), 
             var3 = c(sample(1:100, 10, replace=TRUE)))
df[3,4] = NA
df[6,3:5] = NA
df[8,3:4] = NA
df[10,4:5] = NA

df %>% filter(!if_any(var1:var3, is.na))
#> # A tibble: 6 x 5
#>      id  year  var1  var2  var3
#>   <int> <int> <int> <int> <int>
#> 1     1  2001    13    28    26
#> 2     2  2002    61    77    58
#> 3     4  2004    95    38    58
#> 4     5  2005    38    34    91
#> 5     7  2007    85    46    14
#> 6     9  2009    45    60    40

Utworzony 24.06.2021 przez pakiet reprex (v2.0.0)

1
Ian Gow 24 czerwiec 2021, 14:38