- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要编写一个 dplyr 函数来创建自定义区域图。所以这是我的尝试。
area_plot <- function(data, what, by){
by <- ensym(by)
what <- ensym(what)
data %>%
filter(!is.na(!!by)) %>%
group_by(date, !!by) %>%
summarise(!!what := sum(!!what, na.rm = TRUE)) %>%
complete(date, !!by, fill = rlang::list2(!!what := 0)) %>%
ggplot(aes(date, !!what, fill = !!by)) +
geom_area(position = 'stack') +
scale_x_date(breaks = '1 month', date_labels = '%Y-%m', expand = c(.01, .01)) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = .4)) +
labs(fill = '')
}
by
参数是否有任何默认值可以将所有组的
geom_area
图输出在一起。我知道我可以先使用
if
来定义
ggplot2
中使用的数据,然后在函数中执行以下操作:
if (by != 'default') {
data <- data %>%
filter(!is.na(!!by)) %>%
group_by(date, !!by) %>%
summarise(!!what := sum(!!what, na.rm = TRUE)) %>%
complete(date, !!by, fill = rlang::list2(!!what := 0))}
ggplot(data, aes(date, !!what, fill = !!by)) +
geom_area(position = 'stack') +
scale_x_date(breaks = '1 month', date_labels = '%Y-%m', expand = c(.01, .01)) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 90, vjust = .4)) +
labs(fill = '')
group_by
提供一些值(例如常量),使
summarise
保留原始结构(所以基本上什么都不做),尽管被调用。类似于在
ggplot2
中为某些美学提供常量时的行为。
group
是一个可选的分组变量。
structure(list(date = structure(c(17052, 17654, 17111, 17402,
17090, 17765, 17181, 17301, 17496, 17051, 16980, 17155, 17599,
16986, 17607, 17620, 17328, 17085, 17666, 17759, 17238, 16975,
17242, 17322, 17625, 17598, 17124, 17648, 17675, 17613, 17044,
16984, 16968, 17421, 17152, 17148, 17418, 17017, 17655, 17148,
16981, 17644, 17149, 17090, 17548, 17474, 17564, 17530, 17237,
17679, 17166, 17470, 17427, 17306, 17677, 17600, 17458, 17697,
17602, 16990, 17111, 17150, 17561, 17406, 17135, 17181, 17014,
17419, 17273, 17416, 17101, 17367, 17170, 17015, 17386, 17444,
17507, 17592, 17058, 17292, 16966, 17756, 17239, 17479, 17260,
17477, 16989, 17032, 17219, 17430, 17696, 17487, 17578, 17759,
17269, 17634, 17279, 17478, 17222, 17296), class = "Date"), count = c(2,
4, 2, 3, 6, 1, 4, 8, 1, 5, 1, 5, 1, 1, 2, 6, 3, 5, 2, 7, 3, 4,
1, 3, 4, 2, 4, 1, 2, 3, 16, 1, 5, 4, 3, 4, 4, 6, 1, 3, 3, 1,
3, 10, 5, 1, 4, 2, 2, 4, 5, 26, 4, 9, 3, 1, 3, 1, 4, 1, 2, 3,
1, 13, 3, 1, 3, 1, 1, 3, 1, 3, 3, 4, 1, 2, 2, 3, 1, 9, 3, 1,
2, 1, 4, 2, 1, 2, 4, 3, 2, 3, 1, 6, 5, 1, 2, 2, 3, 4), group = c("NON-FOOD",
NA, NA, NA, NA, "MIX", NA, NA, "MIX", NA, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, "FOOD", NA, "FOOD", NA, NA, "MIX",
NA, NA, NA, "FOOD", "FOOD", NA, NA, NA, NA, "FOOD", NA, NA, "FOOD",
NA, NA, NA, "FOOD", NA, NA, NA, NA, NA, NA, NA, NA, "MIX", NA,
NA, "FOOD", NA, "FOOD", NA, NA, "FOOD", NA, "FOOD", NA, NA, "NON-FOOD",
NA, NA, "MIX", "NON-FOOD", NA, NA, NA, NA, NA, NA, "IMAGE", NA,
"FOOD", NA, NA, NA, "FOOD", NA, "FOOD", NA, NA, NA, NA, NA, NA,
NA, NA, "FOOD", "FOOD", NA, NA, NA)), row.names = c(73008L, 535553L,
122359L, 321655L, 105632L, 646925L, 172409L, 256204L, 394666L,
72385L, 20180L, 156162L, 478525L, 91409L, 485397L, 501386L, 277336L,
100902L, 549629L, 640676L, 209400L, 16603L, 224543L, 272638L,
505291L, 475497L, 131845L, 529041L, 558295L, 491746L, 67156L,
23499L, 11150L, 334454L, 154958L, 150674L, 333348L, 45599L, 536064L,
150673L, 20668L, 524095L, 151809L, 105713L, 433853L, 375687L,
445626L, 420587L, 208594L, 562514L, 162403L, 372594L, 338509L,
259784L, 560356L, 480072L, 361471L, 579474L, 481262L, 26469L,
122119L, 152537L, 443426L, 325045L, 140531L, 171908L, 43547L,
333968L, 237152L, 332106L, 114754L, 298081L, 164923L, 43577L,
311250L, 350267L, 404348L, 470188L, 78329L, 250086L, 9486L, 638289L,
209638L, 379370L, 227299L, 377487L, 26333L, 55058L, 195261L,
340666L, 578515L, 387600L, 457752L, 640729L, 235389L, 514348L,
240303L, 378836L, 197409L, 252746L), class = "data.frame")
最佳答案
这是执行函数前几步的一种方法(我没有深入研究 ggplot
的所有内容,只是介绍了如何进行分组)。通常,要设置默认的“什么都不做”操作,例如默认为不分组,您将使用 argument = NULL
在您的函数中——您可以查看其他函数的文档页面以了解这是如何完成的。 Here's an SO post关于NA
之间的区别和 NULL
.
我不太擅长处理 quosures,但我已经构建了一些函数并且经常依赖于一些 rlang
/tidyselect
辅助函数,例如 rlang::quo_is_null
我在这里使用的。其他人也许可以在没有帮助的情况下重写它。
首先查看您正在寻找的行为,作为分组或未分组的摘要:
library(tidyverse)
# grouped
df %>%
filter(!is.na(group)) %>%
group_by(group) %>%
summarise(count = sum(count, na.rm = TRUE))
#> # A tibble: 4 x 2
#> group count
#> <chr> <dbl>
#> 1 FOOD 34
#> 2 IMAGE 1
#> 3 MIX 8
#> 4 NON-FOOD 6
# not grouped
df %>%
# add in if you want to filter ungrouped data
summarise(count = sum(count, na.rm = TRUE))
#> count
#> 1 347
what_var
作为
what
的quosure版本(rlang 专家,请随时纠正我这个术语......?)。我一般加
_var
到名称以跟踪原始参数是什么以及已经是什么
enquo
已经编了检查参数是否
by
通过创建
by
quosure 为空并检查它是否为空。如果它不为空,即是否为
by
提供了某些列名, 过滤并按该 quosure 分组。如果它为空,只需传递原始数据框。我将数据传递给
else
中的一个新变量语句以避免对原始数据框进行操作。然后,不管数据是否分组,汇总
what
.
to_group_or_not_to_group <- function(data, what, by = NULL) {
what_var <- enquo(what)
if(!rlang::quo_is_null(enquo(by))) {
by_var <- enquo(by)
grouped_or_not <- data %>%
filter(!is.na(!!by_var)) %>%
group_by(!!by_var)
} else {
grouped_or_not <- data
}
grouped_or_not %>%
summarise(!!quo_name(what_var) := sum(!!what_var, na.rm = TRUE))
}
df %>%
to_group_or_not_to_group(what = count, by = group)
#> # A tibble: 4 x 2
#> group count
#> <chr> <dbl>
#> 1 FOOD 34
#> 2 IMAGE 1
#> 3 MIX 8
#> 4 NON-FOOD 6
NULL
作为(不存在)分组变量:
df %>%
to_group_or_not_to_group(what = count, by = NULL)
#> count
#> 1 347
by = NULL
:
df %>%
to_group_or_not_to_group(what = count)
#> count
#> 1 347
关于r - dplyr 函数仅在提供参数时才具有可选分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52835598/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!