【问题标题】:Filtering NAs by group按组过滤 NA
【发布时间】:2021-11-28 05:49:10
【问题描述】:

我有这个 df

df <- data.frame(
    id = c(1L,1L,1L,2L,2L,3L),
    keyword = c("car","hospital",NA,"cat",NA,NA))

我想要这个

df <- data.frame(
    id = c(1L,1L,2L,3L),
    keyword = c("car","hospital","cat",NA))

如果有关键字,我想保留它,如果没有,请保留 NA

尝试类似的东西

df %>% group_by(id) %>% filter(!is.na(keyword) | keyword != " ")

【问题讨论】:

  • 如果一个 id 有多个关键字不是 NA 怎么办。 (假设 id 是您正在谈论的分组变量)?此外,您可以尝试 library(dplyr); df %&gt;% group_by(id) %&gt;% arrange(keyword) %&gt;% summarise(keyword = first(keyword)) 这将保留每个 id 的第一个非 NA(如果有)关键字。
  • @dario 谢谢你,我向你提出了一些建议,并提供了更多类似的数据框。

标签: r filter conditional-statements


【解决方案1】:

您可以有条件地filter 行。

如果在一个组中,所有 NA 值都存在,则返回第一行,否则返回非 NA 行。

library(dplyr)

df %>%
  group_by(id) %>%
  filter(if(all(is.na(keyword))) row_number() == 1 else !is.na(keyword)) %>%
  ungroup

#    id keyword 
#  <int> <chr>   
#1     1 car     
#2     1 hospital
#3     2 cat     
#4     3 NA      

【讨论】:

    【解决方案2】:

    可能的解决方案:首先我们删除 keyword 中所有带有 NA 的行,然后为可能丢失的 ids 添加新行(所有其他列现在都将包含 NA):

    library(dplyr)
    library(tidyr)
    df %>% 
      filter(!is.na(keyword)) %>% 
      full_join(df %>% select(id) %>% unique())
    

    返回:

      id  keyword
    1  1      car
    2  1 hospital
    3  2      cat
    4  3     <NA>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 2014-12-09
      相关资源
      最近更新 更多