对于每个唯一 ID,我希望只有一行基于另一个字段的排名
For each unique ID, I would like to have only one row based on a ranking of another field
最终,我希望创建一个 table,其中包含我在数据集中拥有的每个唯一 ID 以及相应的字段,基于该字段的 "ranking"。
我一直卡在这一步。我考虑过为每个唯一 ID 循环,但想看看是否有更简单的方法。 apply 函数族可能会有所帮助。我也不确定如何对不同的字符串值进行排名(例如,TRUE > FALSE > NA)。
下面是我正在查看的一小部分样本,其中只有两个感兴趣的领域:
df1 <- data.frame(ID = c(1,1,2,2,3,3,3,4,4,5,6,7,7), flag = c("NA", "TRUE", "NA", "FALSE", "TRUE", "TRUE", "FALSE", "NA", "NA", "NA", "TRUE", "FALSE", "FALSE"))
对于每个 ID:
- 如果标志字段中至少有一个 "TRUE",我想提取其中一整行(无论是哪一行)。
- 如果 ID 在标志字段中不包含 "TRUE" 值,但至少在一行中包含 "FALSE",我想提取其中一整行。
- 如果 ID 在标志字段中没有 "TRUE" 或 "FALSE" 值,我仍然需要 "NA" 行之一。
下面是我理想中想要的单独数据框:
ideal.df <- data.frame(ID = c(1,2,3,4,5,6,7), flag = c("TRUE", "FALSE", "TRUE", "NA", "NA", "TRUE", "FALSE"))
在此先感谢您的帮助!
一个选项是使用 slice
和 match
library(dplyr)
df1 %>%
group_by(ID) %>%
slice(which.max(match(flag, c("NA", "TRUE", "FALSE"))))
# A tibble: 7 x 2
# Groups: ID [7]
# ID flag
# <dbl> <fct>
#1 1 TRUE
#2 2 FALSE
#3 3 FALSE
#4 4 NA
#5 5 NA
#6 6 TRUE
#7 7 FALSE
或在 logical
'flag' 列
上使用 rank
和 which.min
df1 %>%
group_by(ID) %>%
slice(which.min(rank(as.logical(flag)) ))
# A tibble: 7 x 2
# Groups: ID [7]
# ID flag
# <dbl> <fct>
#1 1 TRUE
#2 2 FALSE
#3 3 FALSE
#4 4 NA
#5 5 NA
#6 6 TRUE
#7 7 FALSE
一个选项是将 flag
变量转换为有序因子并从每组中获取最大值。
library(dplyr)
df1 %>%
mutate(flag = factor(flag, levels = c("NA", "TRUE", "FALSE"), ordered = TRUE)) %>%
group_by(ID) %>%
slice(which.max(flag))
# ID flag
# <dbl> <ord>
#1 1 TRUE
#2 2 FALSE
#3 3 FALSE
#4 4 NA
#5 5 NA
#6 6 TRUE
#7 7 FALSE
最终,我希望创建一个 table,其中包含我在数据集中拥有的每个唯一 ID 以及相应的字段,基于该字段的 "ranking"。
我一直卡在这一步。我考虑过为每个唯一 ID 循环,但想看看是否有更简单的方法。 apply 函数族可能会有所帮助。我也不确定如何对不同的字符串值进行排名(例如,TRUE > FALSE > NA)。
下面是我正在查看的一小部分样本,其中只有两个感兴趣的领域:
df1 <- data.frame(ID = c(1,1,2,2,3,3,3,4,4,5,6,7,7), flag = c("NA", "TRUE", "NA", "FALSE", "TRUE", "TRUE", "FALSE", "NA", "NA", "NA", "TRUE", "FALSE", "FALSE"))
对于每个 ID:
- 如果标志字段中至少有一个 "TRUE",我想提取其中一整行(无论是哪一行)。
- 如果 ID 在标志字段中不包含 "TRUE" 值,但至少在一行中包含 "FALSE",我想提取其中一整行。
- 如果 ID 在标志字段中没有 "TRUE" 或 "FALSE" 值,我仍然需要 "NA" 行之一。
下面是我理想中想要的单独数据框:
ideal.df <- data.frame(ID = c(1,2,3,4,5,6,7), flag = c("TRUE", "FALSE", "TRUE", "NA", "NA", "TRUE", "FALSE"))
在此先感谢您的帮助!
一个选项是使用 slice
和 match
library(dplyr)
df1 %>%
group_by(ID) %>%
slice(which.max(match(flag, c("NA", "TRUE", "FALSE"))))
# A tibble: 7 x 2
# Groups: ID [7]
# ID flag
# <dbl> <fct>
#1 1 TRUE
#2 2 FALSE
#3 3 FALSE
#4 4 NA
#5 5 NA
#6 6 TRUE
#7 7 FALSE
或在 logical
'flag' 列
rank
和 which.min
df1 %>%
group_by(ID) %>%
slice(which.min(rank(as.logical(flag)) ))
# A tibble: 7 x 2
# Groups: ID [7]
# ID flag
# <dbl> <fct>
#1 1 TRUE
#2 2 FALSE
#3 3 FALSE
#4 4 NA
#5 5 NA
#6 6 TRUE
#7 7 FALSE
一个选项是将 flag
变量转换为有序因子并从每组中获取最大值。
library(dplyr)
df1 %>%
mutate(flag = factor(flag, levels = c("NA", "TRUE", "FALSE"), ordered = TRUE)) %>%
group_by(ID) %>%
slice(which.max(flag))
# ID flag
# <dbl> <ord>
#1 1 TRUE
#2 2 FALSE
#3 3 FALSE
#4 4 NA
#5 5 NA
#6 6 TRUE
#7 7 FALSE