【发布时间】:2021-08-08 04:01:27
【问题描述】:
我的代码快完成了,我需要 3 年的运行总计。我需要各种分组的运行总数。我需要一个函数。
我可以计算分子和分母。
我需要将分子计算的数据帧连接到分母计算的数据帧。我不知道该怎么做。
所以剩下的唯一步骤就是获得一个语法正确的by子句。
我的部分解决方案如下。
library(purrr)
library(dplyr)
library(tidyr)
library(slider) # for grouping consecutive years
# The sample data
set.seed(2021)
EVENT_YEAR = 2010:2015
RE = c('white', 'black', 'Asian')
City = c('Oakland', 'San Francisco', 'San Jose')
Note = 1:3
# data frame for numerator
demoDF_N = expand.grid(EVENT_YEAR = EVENT_YEAR, RE = RE, City = City, Note = Note)
demoDF_N$Numerator = sample(3:10, 162, replace = TRUE)
demoDF_N$EVENT_YEAR = as.factor(demoDF_N$EVENT_YEAR)
demoDF_N$RE = as.factor(demoDF_N$RE)
demoDF_N$City = as.factor(demoDF_N$City)
demoDF_N$Note = as.factor(demoDF_N$Note)
demoDF_D$EVENT_YEAR = as.factor(demoDF_D$EVENT_YEAR)
# data frame for denominator
demoDF_D = expand.grid(EVENT_YEAR = EVENT_YEAR, RE = RE, City = City, Note = Note)
demoDF_D$Denominator = sample(90:120, 162, replace = TRUE)
func1 = function(df1, df2, groups){
result_3_N = df1 %>%
group_by(Note, across({{groups}})) %>%
arrange(Note, across({{groups}}), EVENT_YEAR) %>%
mutate(Numerator_UPDATED = slide_dbl(Numerator, sum, .before = 1, .after = 1,
.complete = TRUE)) %>%
select(Note, {{groups}}, EVENT_YEAR, Numerator_UPDATED) %>%
ungroup()
result_3_N = result_3_N %>% rename(Numerator = Numerator_UPDATED) # simple rename
result_3_N = result_3_N %>% filter(!is.na(Numerator)) # filter out rows not based on 3 full years
# Get EVENT_YEAR to display range of years, e.g., 2008-2010
result_3_N$EVENT_YEAR =
paste(as.integer(as.character(result_3_N$EVENT_YEAR)) - 1, '-',
as.integer(as.character(result_3_N$EVENT_YEAR)) + 1, sep = '')
###
result_3_D = df2 %>%
group_by(Note, across({{groups}})) %>%
arrange(Note, across({{groups}}), EVENT_YEAR) %>%
mutate(Denominator_UPDATED = slide_dbl(Denominator, sum, .before = 1, .after = 1,
.complete = TRUE)) %>%
select(Note, {{groups}}, EVENT_YEAR, Denominator_UPDATED) %>%
ungroup()
result_3_D = result_3_D %>% rename(Denominator = Denominator_UPDATED) # simple rename
result_3_D = result_3_D %>% filter(!is.na(Denominator)) # filter out rows not based on 3 full years
# Get EVENT_YEAR to display range of years, e.g., 2008-2010
result_3_D$EVENT_YEAR =
paste(as.integer(as.character(result_3_D$EVENT_YEAR)) - 1, '-',
as.integer(as.character(result_3_D$EVENT_YEAR)) + 1, sep = '')
# Trying to join the results; INCORRECT: by = c(groups))
# result3 = result_3_N %>% right_join(result_3_D, by = c(groups)) %>%
# replace_na(list(Denominator = 0)) %>% replace_na(list(Numerator = 0))
result3
}
几个电话
res1 = func1(demoDF_N, demoDF_D, EVENT_YEAR)
res1
res2 = func1(demoDF_N, demoDF_D, c(EVENT_YEAR, RE))
res2
【问题讨论】:
-
这需要消化很多。您能否提供最小限度地重现您的问题的示例代码?拥有输入数据和预期输出的样本也将非常有帮助。
-
感谢您的建议。第一组代码是我的数据集 demoDF。然后,我展示了我想拨打的四个电话。然后 func_3() 是我遇到问题的函数。我在这个功能上花了几天时间。 func_3() 之后的代码只是工作交互代码的示例。我不知道如何在此设置中使用参数。我看过 Hadley 的 Advanced R,但没有帮助。
-
能否请您缩短问题?哪个特定部分没有按预期工作?
-
我缩短了这个问题。在多个地方需要插入参数。我插入了 # 这是需要修复的函数 # group_by(我在这里放什么?) #arrange(我在这里放什么?) # mutate(我在这里放什么?) #select(我放什么在这里?)同样在join中,我需要在by()中放入一些东西
-
@user2738483 您的问题仍然很不清楚。标题根本没有提供任何信息,也没有真正的问题。我运行你的代码没有错误,输出是有意义的。您要求“三年运行总计”,但您的代码指的是“3 年运行平均值”。你到底需要什么?
标签: r dplyr functional-programming