根据 NA 数量分配组

Assigning Groups based on NA amount

这里是个新手 - 如果我需要提供更多,请告诉我。 我试图围绕这段代码思考很长一段时间,但我从来没有得到想要的结果。我试图根据不同列中的“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 的数量分配组而不是顺序 - 如果这更易于编码。不过我也没有这样做:)

希望这就是您要找的

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

您可以将它用于您的第二个场景(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

这是一个基本的 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