r - 忽略(但不删除)dplyr group_by 函数中的 NA

标签 r

previous post 中我得到了帮助,可以根据多个其他变量的条件更改单个变量。

但是,出现了更复杂的情况,因为我在分组变量中有多个缺失值。下面是一个示例数据框:

df2 <- data.frame(
  ID = c(101:110),
  Name = c("AA", "BB", "AA", "DD", "EE", "FF", "AA", "GG", "DD", "HH"),
  Age = c(1, 56, 1, 72, 12, 43, 1, 32, 72, 99),
  Gender = c("F", "M", "F", NA , NA, "M", "F", "M", NA, "M"),
  Group = c(1, 2, 1, 2, 1, 4, 1, 3, 2, 4),
  Date = seq(from = as.Date("2019-01-01"), to = as.Date("2019-01-10"), by = 'day'), 
  Order = c("re-do", "first", "first", "first", "re-do", "first", "re-do", "first", "re-do", "first"),
  Site = c(2, 54, 2, 522, 3, 490, 2, 23, 522, 21)
)

>df2
    ID Name Age Gender Group       Date Order Site
1  101   AA   1      F     1 2019-01-01 re-do    2
2  102   BB  56      M     2 2019-01-02 first   54
3  103   AA   1      F     1 2019-01-03 first    2
4  104   DD  72   <NA>     2 2019-01-04 first  522
5  105   EE  12   <NA>     1 2019-01-05 re-do    3
6  106   FF  43      M     4 2019-01-06 first  490
7  107   AA   1      F     1 2019-01-07 re-do    2
8  108   GG  32      M     3 2019-01-08 first   23
9  109   DD  72   <NA>     2 2019-01-09 re-do  522
10 110   HH  99      M     4 2019-01-10 first   21

我有一个根据姓名、年龄、性别和组进行分组的函数,然后根据日期和顺序列更改 ID:

library(dplyr)
df2 %>% 
  group_by(Name, Age, Gender, Group, Site) %>%
  mutate(first_date = ifelse(Order == "first", 
                             Date, 
                             Date[Order == "first"])) %>%
  mutate(ID = ifelse(n() > 1 & Date >= first_date, 
                     ID[Order == "first"], 
                     ID)) %>%
  select(-first_date)

但是,我遇到的问题是 NA 值仍然匹配和使用(请参阅下面第 4 行和第 9 行中复制的 ID 值):

      ID Name    Age Gender Group Date       Order  Site
   <int> <fct> <dbl> <fct>  <dbl> <date>     <fct> <dbl>
 1   101 AA        1 F          1 2019-01-01 re-do     2
 2   102 BB       56 M          2 2019-01-02 first    54
 3   103 AA        1 F          1 2019-01-03 first     2
 4   104 DD       72 NA         2 2019-01-04 first   522
 5   105 EE       12 NA         1 2019-01-05 re-do     3
 6   106 FF       43 M          4 2019-01-06 first   490
 7   103 AA        1 F          1 2019-01-07 re-do     2
 8   108 GG       32 M          3 2019-01-08 first    23
 9   104 DD       72 NA         2 2019-01-09 re-do   522
10   110 HH       99 M          4 2019-01-10 first    21
Warning messages:
1: Factor `Gender` contains implicit NA, consider using `forcats::fct_explicit_na` 
2: Factor `Gender` contains implicit NA, consider using `forcats::fct_explicit_na` 
3: Factor `Gender` contains implicit NA, consider using `forcats::fct_explicit_na` 
4: Factor `Gender` contains implicit NA, consider using `forcats::fct_explicit_na` 

我希望发生的是带有 NA 的行被忽略但没有被删除(这是我在管道中使用 na_omit() 设法获得的唯一结果),因此它看起来像这样:

    ID Name Age Gender Group       Date Order Site
1  101   AA   1      F     1 2019-01-01 re-do    2
2  102   BB  56      M     2 2019-01-02 first   54
3  103   AA   1      F     1 2019-01-03 first    2
4  104   DD  72   <NA>     2 2019-01-04 first  522
5  105   EE  12   <NA>     1 2019-01-05 re-do    3
6  106   FF  43      M     4 2019-01-06 first  490
7  103   AA   1      F     1 2019-01-07 re-do    2
8  108   GG  32      M     3 2019-01-08 first   23
9  109   DD  72   <NA>     2 2019-01-09 re-do  522
10 110   HH  99      M     4 2019-01-10 first   21

最佳答案

我认为对 Gender 列中的 NA 值进行额外检查应该可以解决问题?

library(dplyr)

df2 %>% 
  group_by(Name, Age, Gender, Group, Site) %>%
  mutate(first_date = ifelse(Order == "first", 
                         Date, 
                         Date[Order == "first"]), 
          ID = ifelse(n() > 1 & Date >= first_date & !is.na(Gender), 
                    ID[Order == "first"], 
                    ID)) %>%
   select(-first_date)


#      ID Name    Age Gender Group Date       Order  Site
#   <int> <fct> <dbl> <fct>  <dbl> <date>     <fct> <dbl>
# 1   101 AA        1 F          1 2019-01-01 re-do     2
# 2   102 BB       56 M          2 2019-01-02 first    54
# 3   103 AA        1 F          1 2019-01-03 first     2
# 4   104 DD       72 NA         2 2019-01-04 first   522
# 5   105 EE       12 NA         1 2019-01-05 re-do     3
# 6   106 FF       43 M          4 2019-01-06 first   490
# 7   103 AA        1 F          1 2019-01-07 re-do     2
# 8   108 GG       32 M          3 2019-01-08 first    23
# 9   109 DD       72 NA         2 2019-01-09 re-do   522
#10   110 HH       99 M          4 2019-01-10 first    21

关于r - 忽略(但不删除)dplyr group_by 函数中的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55275194/

相关文章:

R:从光栅对象计算基台、范围和 block 金

r - 如何计算R中单独dfs的位置之间的距离

r - 使用 R shiny 中的 sliderInput 动态渲染等值线图

r - 如何在纵向数据集中进行 Winsorize(或删除单变量异常值)

python - 如何在 Jupyter 笔记本中使用 rpy2 绘制(内联)?

r - 如何在 Power Query 中使用 R 转换步骤获取线性回归模型参数

r - 消除 R 中除 NA 值之外的所有重复项

删除 R 中的 "NA"值(出于某种原因 na.omit 和 complete.cases 仅适用于一个变量...)

r - R:针对nnet多项式拟合的Tukey posthoc测试,以测试多项式分布的总体差异

r - 利用变量值/类型来重命名列