gpt4 book ai didi

r - 使用 dplyr、自定义函数或 purr 的多个条件 if-else

转载 作者:行者123 更新时间:2023-12-03 22:23:11 24 4
gpt4 key购买 nike

我有一个与以下结构类似的数据框:

set.seed(123)  
df<-data_frame(SectionName = rep(letters[1:2], 50),
TimeSpentSeconds = sample(0:360, 100, replace = TRUE),
Correct = sample(0:1, 100, replace = TRUE))

我想通过获取属于特定范围(小于 30、30-60、60-90、...、大于 180)的 TimeSpentSeconds 的所有值来总结这个数据框,将时间标记为这些范围,将它们分组按 SectionName,并找到 Correct 列的总和,使生成的数据框看起来(某事)如下所示:
    TimeGroup             SectionName Correct
<fct> <chr> <int>
1 LessThan30Secs a 2
2 LessThan30Secs b 3
3 30-60 Seconds a 4
4 30-60 Seconds b 3
5 60-90 Seconds a 2
6 60-90 Seconds b 3
7 90-120 Seconds a 4
8 90-120 Seconds b 0
9 120-150 Seconds a 4
10 120-150 Seconds b 0
11 150-180 Seconds a 1
12 150-180 Seconds b 2
13 GreaterThan180Seconds a 11
14 GreaterThan180Seconds b 11

我能够使用以下 if-else 代码成功地做到这一点,其中我将所有时间都变异为具有适当标签、分组和汇总的新列:
x <- c("LessThan30Secs", "30-60 Seconds", "60-90 Seconds","90-120 Seconds", 
"120-150 Seconds", "150-180 Seconds", "GreaterThan180Seconds")

df %>%
mutate(TimeGroup = if_else(TimeSpentSeconds >= 0 & TimeSpentSeconds <= 30, "LessThan30Secs",
if_else(TimeSpentSeconds > 30 & TimeSpentSeconds <= 60, "30-60 Seconds",
if_else(TimeSpentSeconds > 60 & TimeSpentSeconds <= 90, "60-90 Seconds",
if_else(TimeSpentSeconds > 90 & TimeSpentSeconds <= 120, "90-120 Seconds",
if_else(TimeSpentSeconds > 120 & TimeSpentSeconds <= 150, "120-150 Seconds",
if_else(TimeSpentSeconds > 150 & TimeSpentSeconds <= 180, "150-180 Seconds",
if_else(TimeSpentSeconds > 180, "GreaterThan180Seconds", "")))))))) %>%
mutate(TimeGroup = factor(TimeGroup, levels = x)) %>%
arrange(TimeGroup) %>%
group_by(TimeGroup, SectionName) %>%
summarise(Correct = sum(Correct))

但是,必须有更好的方法来做到这一点。我考虑过编写一个函数,但由于我不擅长编写函数,所以并没有走多远。

有没有人对通过我没有想到的 dplyr 方法完成相同输出的更优雅方式有任何想法,编写自定义函数可能在某些时候使用 purrr 包,或其他一些 r 函数?

最佳答案

case_when()会做你想做的。它是嵌套 ifelse() 的整洁替代品声明。

library(dplyr)

mutate(df,
TimeGroup = case_when(
TimeSpentSeconds <= 30 ~ "30 Seconds or less",
TimeSpentSeconds <= 60 ~ "31-60 Seconds",
TimeSpentSeconds <= 90 ~ "61-90 Seconds",
TimeSpentSeconds <= 120 ~ "91-120 Seconds",
TimeSpentSeconds <= 150 ~ "121-150 Seconds",
TimeSpentSeconds <= 180 ~ "151-180 Seconds",
TimeSpentSeconds > 180 ~ "Greater Than 180 Seconds",
TRUE ~ NA_character_)
)
最后一个参数是对不符合任何条件的记录的全部捕获,例如时间是否以某种方式小于 0 秒。

关于r - 使用 dplyr、自定义函数或 purr 的多个条件 if-else,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52028764/

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