[英]How to remove duplicated rows from a dataframe `df` but only when a specific column of the `df` is NA?
我有一個df
有 5 列的數據框。 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
的行,因為它表明該區域沒有觀察到該物種,但是我想刪除df$Distance
的NA
行,當該行具有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”分組,如果有任何非 NA 元素,則filter
“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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.