删除仅在某些行中具有NA的组

时间:2018-10-02 20:23:59

标签: r dplyr

我需要删除一年中每一天都没有测量值的年份。假设这是一个完整的集合,我想摆脱2001年的所有行,因为2001年缺少一项度量。

year    day    value  
2000     1       5
2000     2       3  
2000     3       2
2000     4       3  
2001     1       2
2001     2       NA  
2001     3       6  
2001     4       5

对不起,我没有代码尝试,现在无法解决这个问题,我花了很长时间才走到这一步。希望我可以%>%参与其中,因为这是长期目标。

3 个答案:

答案 0 :(得分:5)

根据NA个值的存在进行过滤:

df %>% 
 group_by(year) %>%
 filter(!anyNA(value))

其他filter条条件(选择您认为最易读的内容):

all(!is.na(value))
sum(is.na(value)) == 0
!any(is.na(value))

答案 1 :(得分:1)

这里是使用基数R的单行解决方案-

df %>% .[!ave(.$value, .$year, FUN = anyNA), ]

示例-

df <- data.frame(year = c(rep(2000, 4), rep(2001, 4)), day = 1:4, value = sample.int(10, 8))
df$value[6] <- NA_integer_

#   year day value
# 1 2000   1     4
# 2 2000   2     3
# 3 2000   3     2
# 4 2000   4     7
# 5 2001   1     8
# 6 2001   2    NA
# 7 2001   3     1
# 8 2001   4     5

df %>% .[!ave(.$value, .$year, FUN = anyNA), ]

#   year day value
# 1 2000   1     4
# 2 2000   2     3
# 3 2000   3     2
# 4 2000   4     7

答案 2 :(得分:1)

在基数R中,您可以执行以下操作:

subset(df,!year %in% year[is.na(value)])
#   year day value
# 1 2000   1     8
# 2 2000   2     5
# 3 2000   3     4
# 4 2000   4     1