0

我需要根据给定的条件删除数据集中的一些行。请浏览示例数据以供参考。

ID  Date       Dur
123 01/05/2000 3
123 08/04/2002 6
564 04/04/2012 2
741 01/08/2011 5
789 02/03/2009 1
789 08/01/2010 NA
789 05/05/2011 NA
852 06/06/2015 3
852 03/02/2016 NA
155 03/02/2008 NA
155 01/01/2009 NA
159 07/07/2008 NA

我主要关心的是 Dur 列。我必须删除组 ID 具有 Dur != NA 的行,即 ID (123,789,852) 具有多个具有 Dur 值的记录/行。所以我需要删除带有 Dur 值的 ID,这意味着整个 ID 为 123,第一条记录为 789 和 852。我不想删除任何 ID (564,741,852) 具有单条记录的 Dur 或任何其他 ID 在 Dur 中为 null .

预期输出:

ID  Date       Dur
564 04/04/2012 2
741 01/08/2011 5
789 08/01/2010 NA
789 05/05/2011 NA
852 03/02/2016 NA
155 03/02/2008 NA
155 01/01/2009 NA
159 07/07/2008 NA

请提出解决问题的代码。提前致谢!

4

2 回答 2

3

一种方法是选择组中的行数为 1 或NA数据中有 ' 行的行。

这可以写成dplyr

library(dplyr)
df %>% group_by(ID) %>% filter(n() == 1 | is.na(Dur))

#    ID Date         Dur
#  <int> <chr>      <int>
#1   564 04/04/2012     2
#2   741 01/08/2011     5
#3   789 08/01/2010    NA
#4   789 05/05/2011    NA
#5   852 03/02/2016    NA
#6   155 03/02/2008    NA
#7   155 01/01/2009    NA
#8   159 07/07/2008    NA

使用data.table

library(data.table)
setDT(df)[, .SD[.N == 1 | is.na(Dur)], ID]

和基础 R :

subset(df, ave(is.na(Dur), ID, FUN = function(x) length(x) == 1 | x))

数据

df <- structure(list(ID = c(123L, 123L, 564L, 741L, 789L, 789L, 789L, 
852L, 852L, 155L, 155L, 159L), Date = c("01/05/2000", "08/04/2002", 
"04/04/2012", "01/08/2011", "02/03/2009", "08/01/2010", "05/05/2011", 
"06/06/2015", "03/02/2016", "03/02/2008", "01/01/2009", "07/07/2008"
), Dur = c(3L, 6L, 2L, 5L, 1L, NA, NA, 3L, NA, NA, NA, NA)), 
class = "data.frame", row.names = c(NA, -12L))
于 2020-09-08T07:39:41.097 回答
-1

我们可以用.Idata.table

library(data.table)
setDT(df1)[df1[, .I[.N == 1| is.na(Dur)], ID]$V1]
于 2020-09-08T22:43:21.817 回答