- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经开始着手编写函数来加快表的生成速度,但我想让该函数尊重用户在管道中所做的早期分组选择。
示例数据:
df<-data.frame(ID=c("A","B","C","A","C","D","A","C","E","B","C","A"),
Year=c(1,1,1,2,2,2,3,3,3,4,4,4),
Credits=c(1,3,4,5,6,7,2,1,1,6,1,2),
Major=c("GS","GS","LA","GS","GS","LA","GS","LA","LA","GS","LA","LA"),
Status=c("green","blue","green","blue","green","blue","green","blue","green","blue","green","blue"),
Group=c("Art","Music","Science","Art","Music","Science","Art","Music","Science","Art","Music","Science"))
以下是我正在处理的函数,它需要/接受一个变量来定义队列、一个信用变量和一个术语变量。
table_headsfte_cohorts<-function(.data,cohortvar,credits,term){
cohortvar<-rlang::ensym(cohortvar)
credits<-rlang::ensym(credits)
term<-rlang::ensym(term)
.data%>%
group_by(!!term,Pidm)%>%
group_by(!!term,!!cohortvar,group_cols())%>%
mutate(on3=1)%>%
mutate(`Headcount`=sum(on3),
`FTE`=round(sum(na.omit(!!credits))/15,1))%>%
mutate(Variable=paste0(cohortvar))%>%
mutate(Category=!!cohortvar)%>%
select(-!!cohortvar)%>%
select(Variable,Category,Headcount,FTE,group_cols())
}
对于可能有兴趣在他们选择的同类群组变量之外使用其他分组变量的用户,我希望最终结果函数允许按如下方式使用:
df2<-df%>%
group_by(Status,Group)%>%
table_headsfte_cohorts(Major,Credits,Year)
除了 cohortvar
和 之外,期望的最终结果将是一个尊重并保留上述
列。group_by
语句中两个分组变量水平的表格来自 table_headsfte_cohorts()
参数的 term
我需要生成同一张表,但对于范围广泛的分组变量和不同数量的分组变量,因此灵 active 将非常有帮助。
编辑:
通过至少允许多个分组变量,以下内容似乎接近了。这不是我所希望的,因为我更希望从管道中读取额外的分组参数:
table_headsfte_cohorts<-function(.data,cohortvar,credits,term,...){
grps<-enquos(...)
cohortvar<-rlang::ensym(cohortvar)
credits<-rlang::ensym(credits)
term<-rlang::ensym(term)
.data%>%
group_by(!!term,!!cohortvar,!!! grps)%>%
mutate(on3=1)%>%
mutate(`Headcount`=sum(on3),
`FTE`=round(sum(na.omit(!!credits))/15,1))%>%
mutate(Variable=paste0(cohortvar))%>%
mutate(Category=!!cohortvar)%>%
select(-!!cohortvar)%>%
select(Variable,Category,Headcount,FTE,!!!grps)
使用上面的,我可以成功运行:
fdfout<-fdf%>%
table_headsfte_cohorts(Major, Credits, Year), getting:
我还可以将其他变量传递给函数以用作额外的分组变量:
fdfout_alt<-fdf%>%
table_headsfte_cohorts(Major,Credits,Year,Status,Group)
产生期望的结果:
不幸的是,当我使用
fdf_no<-fdf%>%
group_by(Status, Group)%>%
table_headsfte_cohorts(Major, Credits, Year)
我得到:
此输出可能会使使用我的函数的人感到困惑,因为他们的 group_by()
行似乎什么都不做。
最佳答案
我添加了一些行,将点内的现有分组变量和新分组变量合并到一个字符向量中。我们可以通过 group_vars
获取现有的分组变量。要将新旧合并在一起,我们必须获取引用分组变量的表达式 get_expr
并将它们转换为字符串。我们可以使用 !!! syms
评估和 all_of
选择分组变量。
这是你的想法吗?
table_headsfte_cohorts <- function(.data, cohortvar, credits, term, ...){
new_grps <- enquos(...)
new_grps <- purrr::map_chr(new_grps, ~ as.character(rlang::get_expr(.x)))
ex_grps <- group_vars(.data)
grp_vars <- c(ex_grps, new_grps)
cohortvar<-rlang::ensym(cohortvar)
credits<-rlang::ensym(credits)
term<-rlang::ensym(term)
.data%>%
group_by(!! term,
!! cohortvar,
!!! syms(grp_vars))%>%
mutate(on3 = 1) %>%
mutate(`Headcount`= sum(on3),
`FTE`= round(sum(na.omit(!!credits))/15,1))%>%
mutate(Variable=paste0(cohortvar))%>%
mutate(Category=!!cohortvar)%>%
select(-!!cohortvar)%>%
select(Variable,Category,Headcount,FTE, all_of(grp_vars))
}
df %>%
group_by(Status, Group) %>%
table_headsfte_cohorts(Major, Credits, Year)
#> Adding missing grouping variables: `Major`
#> Adding missing grouping variables: `Year`, `Major`
#> # A tibble: 12 x 8
#> # Groups: Year, Major, Status, Group [12]
#> Year Major Variable Category Headcount FTE Status Group
#> <dbl> <chr> <chr> <chr> <dbl> <dbl> <chr> <chr>
#> 1 1 GS Major GS 1 0.1 green Art
#> 2 1 GS Major GS 1 0.2 blue Music
#> 3 1 LA Major LA 1 0.3 green Science
#> 4 2 GS Major GS 1 0.3 blue Art
#> 5 2 GS Major GS 1 0.4 green Music
#> 6 2 LA Major LA 1 0.5 blue Science
#> 7 3 GS Major GS 1 0.1 green Art
#> 8 3 LA Major LA 1 0.1 blue Music
#> 9 3 LA Major LA 1 0.1 green Science
#> 10 4 GS Major GS 1 0.4 blue Art
#> 11 4 LA Major LA 1 0.1 green Music
#> 12 4 LA Major LA 1 0.1 blue Science
关于r - 我怎样才能编写一个 tidyverse 友好的函数,在管道的早期尊重 group_by() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66321379/
我正在尝试安装 tidyverse 包以便在我的脚本中使用 gather 函数。每次我尝试安装软件包时都会收到以下消息: * installing *source* package ‘curl’ ..
当我加载tidyVerse时,我收到以下错误。几分钟前,当我运行我的shinyapp时,一切都很好。我该如何解决这个问题呢?
没有名为“tidyverse”的包是我在执行此操作后收到的错误消息: install.packages('tidyverse', dependencies = T); install.packages
我想在不重复的数据帧行之间创建所有可能的对(即 A_B 与 B_A 相同)。 在 tidyverse 中是否有一种优雅的方式来做到这一点? 示例数据: df df_pairs # A tibble:
我想加入两个数据框,我需要将“by”列作为动态列传递。我试图在此处遵循此解决方案 ( How to pass column names for inner join by 2 column sets
我正在尝试编写一些代码来检查字符串是否包含术语列表中包含的任何单词,以便在数据框中创建一个新列。 这是术语列表: vehicles % mutate( asset_type = case_
我有以下数据框: dat % rowwise() %>% mutate(my_ranks = list(rank(c_across(starts_with("x"))))) 但是当我尝试取消嵌
我有一个包含多个变量的数据集,其中两个是日期(开始日期、结束日期)。有时日期间隔已被拆分为序列,例如,您将: 开始:1990-12-12,停止:1990-12-13开始:1990-12-13,停止:1
我正在尝试在 R 中进行库存计算,这需要对每个 Mat-Plant 组合进行逐行计算。这是一个测试数据集 - df 300K 行,所以希望用 tidyverse 做到这一点以获得更优雅和更快的方法。尝
我有我想与我只有开始日期的事件匹配的日期。作为一个简化的代表,假设我想弄清楚在某些事件中谁是总统,但我只有就职日期。 pres % left_join(pres, by = c("date
我想创建具有中间函数的 tidyverse。我有一个结构 temp1 = sapply(df, function(x) .....) temp2 = sapply(temp1, function(x)
是否可以relocate 行 在 tidyverse框架就像可以用于带有 dplyr 的列一样relocate ? 在这个例子中,我想将第 1 行重新定位到位置 5(数据帧的结尾) 我的数据框: df
我想知道是否有人知道 dplyr 扩展包( dbplyr 和 dtplyr )是否允许在通常的 dplyr 工作流程中进行非对等连接?我很少需要 data.table ,但快速非 equi 连接是我总
我想在分组后汇总时,计算另一个因素的特定级别的数量。 在下面的工作示例中,我想计算每个组中 "male" 级别的数量。我已经尝试了很多计数、计数等方法,但找不到一种简单明了的方法来做到这一点。 df
我有一个数据框,其中包含如下所示的数据: df % group_by(group1,group2,one) %>% summarise(n()).有什么方法可以汇总所有三列,然后将它们全部绑定(bin
当涉及到输出表格时,我正在将统计分析脚本从 SPSS 转换为 R,尽管我不断遇到问题。我最近开始使用 tidyverse 包,因此理想情况下希望找到一个与之兼容的解决方案,但更一般地说,我希望能够针对
我想以编程方式rename() 我的data 中的一些变量,这样我就可以在某个时候通过map 访问它。 我正在寻找等同于, library(tidyverse) mtcars %>% rename(
使用examples从 Wickhams 对 R for data science 的 purrr 的介绍中,我正在尝试创建一个双重嵌套列表。 library(gapminder) library(p
我有一些每周收集的数据,其中的一个片段是这样的,通过 dput: p % gather(time,value,railroad, measure, category) %>%
我有数据,我想使用 tidyverse 方法获取多列的一堆汇总统计信息。但是,利用 tidyverse 的 summarize函数,它会将每个列统计信息创建为一个新列,而我更愿意将列名称视为行,将每个
我是一名优秀的程序员,十分优秀!