如何从数据框“df”中删除重复的行,但仅当“df”的特定列为 NA 时?
How to remove duplicated rows from a dataframe `df` but only when a specific column of the `df` is NA?
我有一个包含 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
的行,因为这表明该物种未在该区域观察到,但我想删除行with NA
for df$Distance
当带有 NA
的行是另一行的副本时,不包括列 df$Sp
.
我想获得这个:
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[7,]
和 df[8,]
除了 df$Sp
.
是相等的
有谁知道如何得到我想要的东西?
也许,按操作分组会有所帮助 - 按 'Region.Label'、'Sample.Label'、'Effort'、filter
'Distance' 的非 NA 元素分组如果有任何非 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
我有一个包含 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
的行,因为这表明该物种未在该区域观察到,但我想删除行with NA
for df$Distance
当带有 NA
的行是另一行的副本时,不包括列 df$Sp
.
我想获得这个:
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[7,]
和 df[8,]
除了 df$Sp
.
有谁知道如何得到我想要的东西?
也许,按操作分组会有所帮助 - 按 'Region.Label'、'Sample.Label'、'Effort'、filter
'Distance' 的非 NA 元素分组如果有任何非 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