gpt4 book ai didi

r - 使用 group_by 和 case_when 为每组生成单个值

转载 作者:行者123 更新时间:2023-12-01 13:09:48 24 4
gpt4 key购买 nike

我有一个带有 idstage 的 data.frame。 stage 是一个字符,但对应于一个有序的过程(A -> B -> C -> ...)。

expand.grid(id=c(1:5), stage = LETTERS[1:4]) %>%
arrange(id) %>%
mutate(flag = case_when(str_detect(stage, "D") ~ "Dance",
str_detect(stage, "C") ~ "Climb",
str_detect(stage, "B") ~ "Biceps",
str_detect(stage, "A") ~ "Aerobic"))

这会产生我所期望的,一个逐个矢量化的标志列。但我想要的是我的 case_when 的输出对于整个 id 组都是唯一的。所以我尝试添加 group_by(id)

expand.grid(id=c(1:5), stage = LETTERS[1:4]) %>%
arrange(id) %>%
group_by(id) %>%
mutate(flag = case_when(str_detect(stage, "D") ~ "Dance",
str_detect(stage, "C") ~ "Climb",
str_detect(stage, "B") ~ "Biceps",
str_detect(stage, "A") ~ "Aerobic"))

但这不会改变结果的性质。将 mutate 更改为 summarize 不会产生我所希望的“总结”效果。很可能我不完全理解 case_when()group_by() 的功能,因此我无法编写正确的命令来获取我的摘要'正在寻找。

我预期的输出应该有 idstage 是顺序中的最后一个阶段,flag 根据那个阶段。

     id stage flag 
<int> <fct> <chr>
1 1 D Dance
2 2 D Dance
3 3 D Dance
4 4 D Dance
5 5 D Dance

为了更清楚,我们假设 id 1 和 2 在阶段 A,3 在 B,4 在 C,5 在 D。

toy <- expand.grid(id=c(1:5), stage = LETTERS[1:4]) %>%
arrange(id) %>%
group_by(id) %>%
mutate(flag = case_when(str_detect(stage, "D") ~ "Dance",
str_detect(stage, "C") ~ "Climb",
str_detect(stage, "B") ~ "Biceps",
str_detect(stage, "A") ~ "Aerobic"))
# grabbing only some of them
toy <- toy[c(1, 5, 10, 15, 20),]

输出应该是这样的:

     id stage flag   
<int> <fct> <chr>
1 1 A Aerobic
2 2 A Aerobic
3 3 B Biceps
4 4 C Climb
5 5 D Dance

我可以接受重复的 id,我可以从那里总结。

最佳答案

您可以使用 any(以及 case_when 中的操作顺序来获取您想要的 flag,在 summarize 中。我们需要添加一点以保留 stage

expand.grid(id=c(1:5), stage = LETTERS[1:4]) %>%
arrange(id) %>%
group_by(id) %>%
summarize(
stage = intersect(c("D","C","B","A"), stage)[1],
flag = case_when(any(str_detect(stage, "D")) ~ "Dance",
any(str_detect(stage, "C")) ~ "Climb",
any(str_detect(stage, "B")) ~ "Biceps",
any(str_detect(stage, "A")) ~ "Aerobic")
)
# # A tibble: 5 x 3
# id stage flag
# <int> <chr> <chr>
# 1 1 D Dance
# 2 2 D Dance
# 3 3 D Dance
# 4 4 D Dance
# 5 5 D Dance

但是,使用 left_join 的替代方法避免了 case_when 的分段操作。

acronyms <- data.frame(
prio = 1:4,
stage = c("D", "C", "B", "A"),
flag = c("Dance", "Climb", "Biceps", "Aerobic")
)

expand.grid(id=c(1:5), stage = LETTERS[1:4]) %>%
left_join(acronyms) %>%
arrange(id, prio) %>%
group_by(id) %>%
slice(1) %>%
select(-prio) %>%
ungroup()

acronyms 中的基本stage/flag 关联大部分就足够了;我添加 prio 是为了始终为每个 id 获取最重要的确定性和简单方法。根据您的最终需要,这里可能还有其他有用的技巧。

关于r - 使用 group_by 和 case_when 为每组生成单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60833047/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com