r 仅当特定列中不丢失时才保留行
r retain rows only if non missing in specific column
我的数据框有这样的列和行
Id Date Col1 Col2 Col3 X1
1 1/1/22 NA 1 0
1 1/1/22 0 0 1 6
2 5/7/21 0 1 0
2 5/7/21 0 2 0
我喜欢删除 X1 列的值缺失或为空的重复行(相同 ID,相同日期)的行。如果两行都缺少该 ID 和日期的 X1,则不要删除。只有当一个缺失而另一个不缺失时,才删除缺失的行。
预期输出
Id Date Col1 Col2 Col3 X1
1 1/1/22 0 0 1 6
2 5/7/21 0 1 0
2 5/7/21 0 2 0
我试过了
library(tidyr)
df %>%
group_by(Id, Date) %>%
drop_na(X1)
这会删除所有带有 NA 或缺失的行,而我只剩下一行,这不是我想要的。任何建议都非常适用。谢谢
如果 'X1' 中只有缺失值,我们可以在 filter
到 return all
行中创建一个条件,或者只是删除缺失的行
library(dplyr)
df %>%
group_by(Id, Date) %>%
filter(if(all(is.na(X1))) TRUE else complete.cases(X1)) %>%
ungroup
-输出
# A tibble: 3 × 6
Id Date Col1 Col2 Col3 X1
<int> <chr> <int> <int> <int> <int>
1 1 1/1/22 0 0 1 6
2 2 5/7/21 0 1 0 NA
3 2 5/7/21 0 2 0 NA
或者没有 if/else
,使用 |
和 &
条件
df %>%
group_by(Id, Date) %>%
filter(any(complete.cases(X1)) & complete.cases(X1) |
all(is.na(X1))) %>%
ungroup
数据
df <- structure(list(Id = c(1L, 1L, 2L, 2L), Date = c("1/1/22", "1/1/22",
"5/7/21", "5/7/21"), Col1 = c(NA, 0L, 0L, 0L), Col2 = c(1L, 0L,
1L, 2L), Col3 = c(0L, 1L, 0L, 0L), X1 = c(NA, 6L, NA, NA)),
class = "data.frame", row.names = c(NA,
-4L))
我的数据框有这样的列和行
Id Date Col1 Col2 Col3 X1
1 1/1/22 NA 1 0
1 1/1/22 0 0 1 6
2 5/7/21 0 1 0
2 5/7/21 0 2 0
我喜欢删除 X1 列的值缺失或为空的重复行(相同 ID,相同日期)的行。如果两行都缺少该 ID 和日期的 X1,则不要删除。只有当一个缺失而另一个不缺失时,才删除缺失的行。
预期输出
Id Date Col1 Col2 Col3 X1
1 1/1/22 0 0 1 6
2 5/7/21 0 1 0
2 5/7/21 0 2 0
我试过了
library(tidyr)
df %>%
group_by(Id, Date) %>%
drop_na(X1)
这会删除所有带有 NA 或缺失的行,而我只剩下一行,这不是我想要的。任何建议都非常适用。谢谢
如果 'X1' 中只有缺失值,我们可以在 filter
到 return all
行中创建一个条件,或者只是删除缺失的行
library(dplyr)
df %>%
group_by(Id, Date) %>%
filter(if(all(is.na(X1))) TRUE else complete.cases(X1)) %>%
ungroup
-输出
# A tibble: 3 × 6
Id Date Col1 Col2 Col3 X1
<int> <chr> <int> <int> <int> <int>
1 1 1/1/22 0 0 1 6
2 2 5/7/21 0 1 0 NA
3 2 5/7/21 0 2 0 NA
或者没有 if/else
,使用 |
和 &
条件
df %>%
group_by(Id, Date) %>%
filter(any(complete.cases(X1)) & complete.cases(X1) |
all(is.na(X1))) %>%
ungroup
数据
df <- structure(list(Id = c(1L, 1L, 2L, 2L), Date = c("1/1/22", "1/1/22",
"5/7/21", "5/7/21"), Col1 = c(NA, 0L, 0L, 0L), Col2 = c(1L, 0L,
1L, 2L), Col3 = c(0L, 1L, 0L, 0L), X1 = c(NA, 6L, NA, NA)),
class = "data.frame", row.names = c(NA,
-4L))