R потеря данных с отчетливым () - PullRequest
0 голосов
/ 19 марта 2019

Использование различных для удаления дубликатов в объединенном наборе данных, однако я теряю данные, потому что различные сохраняют только первую запись.

Пример кадра данных "a"

 SiteID PYear   Habitat num.1
000901W 2011    W   NA
001101W 2007    W   NA
001801W 2005    W   NA
002001W 2017    W   NA
002401F 2006    F   NA
002401F 2016    F   NA
004001F 2006    F   NA
004001W 2006    W   NA
004101W 2007    W   NA
004101W 2007    W   16
004701F 2017    F   NA
006201F 2008    F   NA
006501F 2009    F   NA
006601W 2007    W   2
006601W 2007    W   NA
006803F 2009    F   NA
007310F 2018    F   NA
007602W 2017    W   NA
008103W 2011    W   NA
008203F 2007    F   1

Coding:

a<-distinct(a,SiteID, .keep_all = TRUE)

Я хотел бы знать, как удалять дубликаты на основе SiteID и num.1, удаляя дубликаты, однако я не хочу избавляться от дубликатов, которые имеют числовые значения в столбце num.1. Например, в кадре данных 004101W и 006601W имеют несколько записей, но я хочу сохранить целое число, а не NA.

1 Ответ

0 голосов
/ 20 марта 2019

(Спасибо за обновление с более репрезентативными образцами данных!)

a теперь имеет 20 строк с 17 различными значениями SiteID.

Три из этих SiteID имеют несколько строк:

library(tidyverse)
a %>% 
  add_count(SiteID) %>%
  filter(n > 1)

## A tibble: 6 x 5
#  SiteID  PYear Habitat num.1     n
#  <chr>   <int> <chr>   <int> <int>
#1 002401F  2006 F          NA     2    # Both have NA for num.1
#2 002401F  2016 F          NA     2    #  ""

#3 004101W  2007 W          NA     2    # Drop 
#4 004101W  2007 W          16     2    # Keep this one

#5 006601W  2007 W           2     2    # Keep this one
#6 006601W  2007 W          NA     2    # Drop

Если мы хотим расставить приоритеты строк без NA в num.1, мы можем arrange по номеру 1 в каждом SiteID, так, чтобы NA приходились последними для каждого SiteID, а функция distinct будет расставлять приоритеты num.1. со значением не-NA.

(Альтернатива также предоставляется в том случае, если вы хотите сохранить исходную сортировку в a, но все же перемещать значения NA в num.1 до конца. В термине is.na(num.1) NA будут оцениваться как TRUE и будут следовать за предоставленными значениями, которые будут оцениваться как ЛОЖЬ.)

a %>% 
  arrange(SiteID, num.1) %>%
  #arrange(SiteID, is.na(num.1)) %>%    # Alternative to preserve orig order
  distinct(SiteID, .keep_all = TRUE)

    SiteID PYear Habitat num.1
1  000901W  2011       W    NA
2  001101W  2007       W    NA
3  001801W  2005       W    NA
4  002001W  2017       W    NA
5  002401F  2006       F    NA     # Kept first appearing row, since both NA num.1
6  004001F  2006       F    NA
7  004001W  2006       W    NA
8  004101W  2007       W    16     # Kept non-NA row
9  004701F  2017       F    NA
10 006201F  2008       F    NA
11 006501F  2009       F    NA
12 006601W  2007       W     2     # Kept non-NA row
13 006803F  2009       F    NA
14 007310F  2018       F    NA
15 007602W  2017       W    NA
16 008103W  2011       W    NA
17 008203F  2007       F     1

Импорт данных выборки

a <- read.table(header = T, stringsAsFactors = F,
  text = " SiteID PYear   Habitat num.1
000901W 2011    W   NA
001101W 2007    W   NA
001801W 2005    W   NA
002001W 2017    W   NA
002401F 2006    F   NA
002401F 2016    F   NA
004001F 2006    F   NA
004001W 2006    W   NA
004101W 2007    W   NA
004101W 2007    W   16
004701F 2017    F   NA
006201F 2008    F   NA
006501F 2009    F   NA
006601W 2007    W   2
006601W 2007    W   NA
006803F 2009    F   NA
007310F 2018    F   NA
007602W 2017    W   NA
008103W 2011    W   NA
008203F 2007    F   1")
...