以长期格式删除缺失案件

问题描述 投票:0回答:4

我有一个带有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()
r dataframe dplyr group-by tidyr
4个回答
4
投票
,我们可以过滤到没有NA的1行评估1行,并将其加入原始数据,以相同的结果。

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

4
投票
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

3
投票

dataset$assessment == 1

here是
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
的解决方案。优点是您可以使用

3
投票
将相同的逻辑函数应用于多列。

if_any()

or
pick()
library(dplyr)

dataset %>%
  filter(!any(if_any(scoreA:scoreB, is.na) & assessment == 1),
         .by = id)

    
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.