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:在 UDF 中使用动态命名的变量

R语言dplyr包使用recode函数进行数据列内容编码转换实战:类似于pandas中的map函数(例如,将内容从字符串映射到数值)

函数R中的Dplyr变量名称

使用 dplyr 重命名未命名的变量

R元编程:使用函数调用粘贴逻辑表达式