我有一个带有3个评估点的长格式数据集,例如:
dataset = data.frame(
id = c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
assessment = c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
scoreA = c(7,9,5,NA,5,11,2,3,9,1,NA,NA,7,NA,5),
scoreB = c(1,2,7,6,1,11,3,3,2,1,12,NA,NA,4,5)
)
如果在ID
处有任何
NA
,则我想删除属于同一
assessment == 1
的所有观测值。例如,
ID
的
2
和
5
在
NA
中,因此应排除在外。 我正在尝试使用
assessment == 1
和
{dplyr}
函数,沿{tidyr}
,
group_by()
,...
我们只能保留那些ID,而评估1:中没有任何丢失的得分/得分。
filter()
library(dplyr)
dataset |>
filter(!any(is.na(scoreA[assessment == 1]) |
is.na(scoreB[assessment == 1])), .by = id)
id assessment scoreA scoreB
1 1 1 7 1
2 1 2 9 2
3 1 3 5 7
4 3 1 2 3
5 3 2 3 3
6 3 3 9 2
7 4 1 1 1
8 4 2 NA 12
9 4 3 NA NA
您可以使用
dataset |>
filter(assessment == 1) |>
tidyr::drop_na() |>
# distinct(id) |> # only needed if there might be multiple assessment 1's for an id
left_join(dataset)
+
subset
na.omit
或在baser中,您可以使用
> subset(dataset, id %in% na.omit(subset(dataset, assessment == 1))$id)
id assessment scoreA scoreB
1 1 1 7 1
2 1 2 9 2
3 1 3 5 7
7 3 1 2 3
8 3 2 3 3
9 3 3 9 2
10 4 1 1 1
11 4 2 NA 12
12 4 3 NA NA
&
!complete.cases
dataset$assessment == 1
dataset[!dataset$id %in% dataset[!complete.cases(dataset) & dataset$assessment == 1,]$id, ]
id assessment scoreA scoreB
1 1 1 7 1
2 1 2 9 2
3 1 3 5 7
7 3 1 2 3
8 3 2 3 3
9 3 3 9 2
10 4 1 1 1
11 4 2 NA 12
12 4 3 NA NA
或dplyr
的解决方案。优点是您可以使用
if_any()
pick()
library(dplyr)
dataset %>%
filter(!any(if_any(scoreA:scoreB, is.na) & assessment == 1),
.by = id)