根据 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
值的无序数量),但恐怕如果顺序很重要,您必须使用自己的解决方案,也许您可以稍微改进一下当全部或非 NA
s:
时不那么冗长
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
这里是个新手 - 如果我需要提供更多,请告诉我。 我试图围绕这段代码思考很长一段时间,但我从来没有得到想要的结果。我试图根据不同列中的“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
值的无序数量),但恐怕如果顺序很重要,您必须使用自己的解决方案,也许您可以稍微改进一下当全部或非 NA
s:
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