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