R dplyr:将剪切和粘贴转换为调用函数
Posted
技术标签:
【中文标题】R dplyr:将剪切和粘贴转换为调用函数【英文标题】:R dplyr: converting cut-and paste to a calling function 【发布时间】: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 年运行平均值”。你到底需要什么? 【参考方案1】:如果要获得 3 年的运行平均值,则需要使用 slider::slide_dbl()
内部的 mean
函数。
如果您只希望在 YEAR 上运行平均值,那么您将不得不对任何其他变量进行分组。请注意,您的数据集应该是完整的,即应该存在每一年(虽然它可以是 NA)。否则,运行平均值可能是错误的。
代码如下:
df1 %>%
group_by(RE, City, Note) %>%
arrange(EVENT_YEAR) %>%
mutate(Numerator_UPDATED = zoo::rollmean(Numerator, 3, fill=NA),
Numerator_UPDATED2 = slider::slide_dbl(Numerator, mean, .before = 1, .after = 1, .complete = TRUE)) %>%
arrange(Note, City, RE, EVENT_YEAR)
# # A tibble: 162 x 7
# # Groups: RE, City, Note [27]
# EVENT_YEAR RE City Note Numerator Numerator_UPDATED Numerator_UPDATED2
# <int> <fct> <fct> <int> <int> <dbl> <dbl>
# 1 2010 white Oakland 1 9 NA NA
# 2 2011 white Oakland 1 8 8.33 8.33
# 3 2012 white Oakland 1 8 6.67 6.67
# 4 2013 white Oakland 1 4 7 7
# 5 2014 white Oakland 1 9 6.33 6.33
# 6 2015 white Oakland 1 6 NA NA
# 7 2010 black Oakland 1 6 NA NA
# 8 2011 black Oakland 1 8 8 8
# 9 2012 black Oakland 1 10 8.67 8.67
# 10 2013 black Oakland 1 8 7.67 7.67
【讨论】:
以上是关于R dplyr:将剪切和粘贴转换为调用函数的主要内容,如果未能解决你的问题,请参考以下文章
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式,请确保您的Main函数带有STAThreadAttribute标记。 多线程操作剪切板的时候。
R语言dplyr包使用recode函数进行数据列内容编码转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)