r-如何从数据帧"df"中删除重复的行,但仅当"df"的特定列为NA时



我有一个包含5列的数据帧dfRegion.Label表示进行研究的区域,Sample.Label是我统计鸟类的区域内的特定区域,Sp是我在该特定区域发现的鸟类,Distance是鸟类和我之间的距离,Effort是我在区域内寻找鸟类的时间。当DistanceNA时,意味着对于该区域没有观察到该物种。作为数据帧的一个例子,我有:

df <- data.frame(Region.Label=c("A","A","A","A","A","A","A","A"),
Sample.Label=c(1,1,1,2,2,2,3,3),
Sp=c("ZZ","ZZ","BB","ZZ","BB","CC","ZZ","BB"),
Distance=c(2,7,NA,NA,NA,6,NA,NA),
Effort=c(99,99,99,87,87,87,72,72))
df$Region.Label <- as.factor(df$Region.Label)
df$Sample.Label <- as.numeric(df$Sample.Label)
df
Region.Label Sample.Label Sp Distance Effort
1            A            1 ZZ        2     99
2            A            1 ZZ        7     99
3            A            1 BB       NA     99
4            A            2 ZZ       NA     87
5            A            2 BB       NA     87
6            A            2 CC        6     87
7            A            3 ZZ       NA     72
8            A            3 BB       NA     72

这里,我想删除列df$Distance中具有NA的所有行,因为这表明在该区域中没有观察到物种,但当具有NA的行与除列df$Sp之外的另一行重复时,我想为df$Distance删除具有NA的行。

我想获得这个:

Region.Label Sample.Label Sp Distance Effort
1            A            1 ZZ        2     99
2            A            1 ZZ        7     99
3            A            2 CC        6     87
4            A            3 ZZ       NA     72

在本例中,我不删除df[7,],因为Sample.Label与前面的行不同。我删除了df[8,],因为除了df$Sp之外,df[7,]df[8,]是相等的。

有人知道如何得到我想要的吗?

也许,按操作分组会有所帮助-按'Region.Label'、'Sample.Label]、'Effort'、filter分组,如果有任何非NA元素,则为'Distance'的非NA元素或获取第一行(row_number() == 1(

library(dplyr)
df %>% 
group_by(Region.Label, Sample.Label, Effort) %>% 
filter(if(all(is.na(Distance))) row_number() == 1 else !is.na(Distance)) %>%
ungroup

-输出

# A tibble: 4 × 5
Region.Label Sample.Label Sp    Distance Effort
<fct>               <dbl> <chr>    <dbl>  <dbl>
1 A                       1 ZZ           2     99
2 A                       1 ZZ           7     99
3 A                       2 CC           6     87
4 A                       3 ZZ          NA     72

最新更新