首页 > 解决方案 > 如何删除特定列中具有 NA 的行,但前提是它们在另一列中有重复?

问题描述

所以我有这个数据框,其中有些行在“物种”列中重复,有些则没有。所有类型的行中都有 NA,包括重复的和不重复的。

Species            |  A  |  B  |  
--------------------------------
Tilapia guineensis |  1  |  10 |  
Tilapia guineensis |  1  |  NA |   
Tilapia zillii     |  3  |  23 |  
Tilapia zillii     |  3  |  NA |  
Eutrigla gurnardus | 18  |  4  |
Caramila artida    |  9  |  NA |  
Sprattus sprattus  |  7  |  6  |
Spalili burcant    | 11  |  NA |

我想删除在 B 列中具有 NA 的行,但前提是它们属于重复行。我的输出将是这样的:

Species            |  A  |  B  |  
--------------------------------
Tilapia guineensis |  1  |  10 |    
Tilapia zillii     |  3  |  23 |    
Eutrigla gurnardus | 18  |  4  |
Caramila artida    |  9  |  NA |  
Sprattus sprattus  |  7  |  6  |
Spalili burcant    | 11  |  NA |

基本上,如果某一行在 Species 列中重复并且在 B 列中有一个 NA,我想用 NA 删除该行。但是,如果某一行在 Species 列中是唯一的,我想保留它,即使它有 NA。

抱歉,如果我感到困惑,请提前致谢。

可重现的数据格式:

df <- read.csv(text="
Species,A,B
Tilapia guineensis,1,10
Tilapia guineensis,1,NA
Tilapia zillii,3,23
Tilapia zillii,3,NA
Eutrigla gurnardus,18,4
Caramila artida,9,NA
Sprattus sprattus,7,6
Spalili burcant,11,NA")

标签: r

解决方案


我认为您可以避免使用任何分组逻辑,并一次获得结果:

df[!(duplicated(df$Species) & is.na(df$B)),]
#             Species  A  B
#1 Tilapia guineensis  1 10
#3     Tilapia zillii  3 23
#5 Eutrigla gurnardus 18  4
#6    Caramila artida  9 NA
#7  Sprattus sprattus  7  6
#8    Spalili burcant 11 NA

推荐阅读