识别 R 中多个列中缺失的唯一值

问题描述 投票:0回答:1

我有一个包含三列的数据集,理论上应该具有相同数量的唯一观察结果。

这是数据示例:

speciesID                          common_name                       species
        s001                        common lizard              Zootoca vivipara
        s002                     social tuco-tuco           Ctenomys sociabilis
        s002                     social tuco-tuco           Ctenomys sociabilis
        s002                     social tuco-tuco           Ctenomys sociabilis
        s002                     social tuco-tuco           Ctenomys sociabilis
        s002                     social tuco-tuco           Ctenomys sociabilis
        s003                           red grouse      Lagopus lagopus scoticus
        s003                           red grouse      Lagopus lagopus scoticus
        s004                                  elk                Cervus elaphus

完整的数据集可以在这里找到。

但是,当我检查唯一观察值的数量时,它们并不匹配。

df %>% as_tibble() %>% count(speciesID) %>% nrow() #148 unique values       
df %>% as_tibble() %>% count(common_name) %>% nrow() #150 unique values     
df %>% as_tibble() %>% count(species) %>% nrow() #147 unique values

有没有办法找出 2 个缺失的唯一值来自

speciesID
列以及 3 个缺失的唯一值来自
species
列?

理想情况下,我希望能够识别问题行,以便我可以返回原始数据并修复错误(即应该有 150 个唯一记录)。

我希望有一种方法可以在 R 中执行此操作,而不是手动检查约 700 行数据。

我确实使用

anti_join
进行了探索,但这并不是很成功。

我在 R 领域工作,对

dplyr
最满意。

r dplyr anti-join
1个回答
0
投票

找到重复内容的一种方法:

aa <- readr::read_csv("clean_data_species.csv")[,-1]
distinct(aa) |>
  filter(.by = speciesID, n() > 1)
# # A tibble: 6 × 3
#   speciesID common_name                          species                   
#   <chr>     <chr>                                <chr>                     
# 1 s011      banner-tailed kangaroo rat           Dipodomys spectabilis     
# 2 s011      dwarf mongoose                       Helogale parvula          
# 3 s030      north american red squirrel          Tamiasciurus hudsonicus   
# 4 s030      eurasian red squirrel                Sciurus vulgaris          
# 5 s045      northern spotted owl                 Strix occidentalis caurina
# 6 s045      grey red-backed vole/grey-sided vole Clethrionomys rufocanus   
distinct(aa) |>
  filter(.by = common_name, n() > 1)
# # A tibble: 2 × 3
#   speciesID common_name species    
#   <chr>     <chr>       <chr>      
# 1 s015      great tit   Parus major
# 2 s073      great tit   Parus major
distinct(aa) |>
  filter(.by = species, n() > 1)
# # A tibble: 8 × 3
#   speciesID common_name            species              
#   <chr>     <chr>                  <chr>                
# 1 s015      great tit              Parus major          
# 2 s020      gray jay               Perisoreus canadensis
# 3 s073      great tit              Parus major          
# 4 s074      pied babbler           Turdoides bicolor    
# 5 s109      eurasian kestrel       Falco tinnunculus    
# 6 s110      southern pied babblers Turdoides bicolor    
# 7 s129      canada jay             Perisoreus canadensis
# 8 s106      common kestrel         Falco tinnunculus    

每一行都表示其中一列中存在重复值。例如,在

speciesID
中,我们有 3 个值,其中有 2 行:
s011
s030
s045
,我们可以在此处看到
common_name
species
的具体值成对。

类似地,对于

common_name
(只有一个级别是重复的,事实上几乎完美)和
species
(四对,一些具有共同点)。

© www.soinside.com 2019 - 2024. All rights reserved.