【问题标题】:Assigning Groups based on NA amount根据 NA 数量分配组
【发布时间】:2021-08-11 22:29:28
【问题描述】:

这里是个新手 - 如果我需要提供更多信息,请告诉我。 我试图围绕这段代码思考很长一段时间,但我从来没有得到想要的结果。我试图根据不同列中的“NA”数量分配组。我创建了一个最小的工作数据集来可视化问题所在 - 并提供了我迄今为止尝试运行的代码。最终我想根据他们是否有 1 个缺失、2 个缺失或 3 个缺失跟进点来创建组。

我的数据集如下所示:

my_data <- data.frame( 
  Follow_Up1 = c(100, 200, 300, 1, NA, NA, 50, 10, 5, NA),
  Follow_Up2 = c(NA,  500 ,400,380,NA, NA, 500, 780,NA,500),
  Follow_up3 = c(NA, NA, 1000, 800,NA, 1200, 1100, 1200, 990, NA) 
) 

follow_Up <- my_data %>% 
  mutate(Group = case_when(is.na(Follow_Up1) & is.na(Follow_Up2) & is.na(Follow_Up3)~1, 
                           !is.na(Follow_Up1) & is.na(Follow_Up2) & is.na(Follow_Up3)~2, 
                           is.na(Follow_Up1) & !is.na(Follow_Up2) & is.na(Follow_Up3)~3,
                           !is.na(Follow_Up1) & !is.na(Follow_Up2) & !is.na(Follow_Up3)~4,
                           !is.na(Follow_Up1) & !is.na(Follow_Up2) & is.na(Follow_Up3)~5,
                           is.na(Follow_Up1) & is.na(Follow_Up2) & !is.na(Follow_Up3)~6, 
                           !is.na(Follow_Up1) & is.na(Follow_Up2) & !is.na(Follow_Up3)~7 
))

Expected Output: 

   Follow_up1  Follow_up2  Follow_Up3 Group 
1   100          <NA>       <NA>       2
2   200          500        <NA>       5
3   300          400        1000       4
4   1            380        800        4 
5   <NA>         <NA>       <NA>       1
6   <NA>         <NA>       1200       6
7   50           500        1100       4
8   10           78         1200       4
9   5            <NA>       990        7
10  <NA>         500        <NA>       2

如果这不起作用,我也可以根据 NA 的数量而不是订单来分配组 - 如果这更易于编码。虽然我也没有这样做:)

【问题讨论】:

    标签: r dataframe na dplyr


    【解决方案1】:

    希望这就是你要找的东西

    my_data$group <- rowSums(is.na(my_data))
    

    【讨论】:

      【解决方案2】:

      您可以将它用于您的第二个场景(NA 值的无序数量),但我担心如果订单很重要,您必须使用自己的解决方案,也许您可​​以让它在什么时候变得不那么冗长全部或非NAs:

      library(dplyr)
      
      my_data %>%
        rowwise() %>%
        mutate(group = sum(is.na(c_across(everything()))), 
               group = ifelse(group == 1, 3, ifelse(group == 3, 1, group))) 
      
      
      # A tibble: 10 x 4
      # Rowwise: 
         Follow_Up1 Follow_Up2 Follow_up3 group
              <dbl>      <dbl>      <dbl> <dbl>
       1        100         NA         NA     2
       2        200        500         NA     3
       3        300        400       1000     0
       4          1        380        800     0
       5         NA         NA         NA     1
       6         NA         NA       1200     2
       7         50        500       1100     0
       8         10        780       1200     0
       9          5         NA        990     3
      10         NA        500         NA     2
      

      【讨论】:

      • 谢谢,这段代码对我很有效。我稍微调整了一下,因为我的数据集包含更多变量。我用了“sum(is.na(across(starts_with("FU"))))”
      • 很高兴它有帮助。我的荣幸。实际上它是c_across,因为您正在进行逐行操作。主要与rowwise函数配合使用。
      【解决方案3】:

      这是一个基本的 R 选项 -

      vec <- apply(is.na(my_data), 1, paste0, collapse = ' ')
      my_data$Group <- match(vec, unique(vec))
      my_data
      
      #   Follow_Up1 Follow_Up2 Follow_up3 Group
      #1         100         NA         NA     1
      #2         200        500         NA     2
      #3         300        400       1000     3
      #4           1        380        800     3
      #5          NA         NA         NA     4
      #6          NA         NA       1200     5
      #7          50        500       1100     3
      #8          10        780       1200     3
      #9           5         NA        990     6
      #10         NA        500         NA     7
      

      或者使用dplyr -

      library(dplyr)
      
      my_data %>%
        is.na() %>%
        as.data.frame() %>%
        group_by(across()) %>%
        mutate(Group = cur_group_id()) %>%
        ungroup
      

      【讨论】:

      • 谢谢,我也将 cross 更改为 (across(starts_with("FU"))) - 但它成功了。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多