【问题标题】:Dysfunctional....dplyr functions not running in custom function功能失调....dplyr 函数未在自定义函数中运行
【发布时间】:2015-07-25 14:21:55
【问题描述】:

在我的研究中,我组装了各种大小(100 到 50000 行)和复杂性(2 到 6 个分组变量)的数据集,但通常对所有数据集进行相同的计算集。我经常为每个数据集编写特定的 R 代码,但这变得非常耗时。现在我正在尝试编写灵活的函数来进行计算。我对 dplyr 包很满意,但是在将 dplyrs 函数合并到我的自定义函数中时遇到了麻烦。欢迎任何一般性建议,但以下是我目前的问题。

我试图让这个例子尽可能真实,所以我希望这个例子清楚地表达了我当前的问题。我正在尝试将具有 4 个分组变量的 DATA 输入一个函数,该函数计算每个 TAXAGENUSHABITATDATE 的平均值。然后我需要在每个TAXAGENUS 中安排DATES 的功能。我下面的功能是抛出各种错误。我已经包含了所需的RESULT。提前感谢您的任何帮助和建议。

DATA
 DATE   HABITAT TAXA    GENUS   1   2
06/30/13    Pool    51  A   10  10
06/30/13    Pool    51  A   4   4
06/30/13    Riff    51  A   1   1
06/30/13    Riff    51  A   3   3
07/27/13    Pool    51  A   10  10
07/27/13    Pool    51  A   4   4
07/27/13    Riff    51  A   1   1
07/27/13    Riff    51  A   3   3
06/30/13    Pool    43  B   10  10
06/30/13    Pool    43  B   4   4
06/30/13    Riff    43  B   1   1
06/30/13    Riff    43  B   3   3
07/27/13    Pool    43  B   10  10
07/27/13    Pool    43  B   4   4
07/27/13    Riff    43  B   1   1
07/27/13    Riff    43  B   3   3

不同的分组变量。我的想法是在代码的开头设置这些通用分组向量,然后将它们输入到函数中。这些通用分组变量中的变量数量将根据所分析的数据集而变化。例如,TAXA.INFO 可能包含 4 个分组 #variables,并且可能还有额外的 GROUP.2 和 GROUP.3。

library(dplyr)
library(tidyr)
library(lubridate) 

TAXA.INFO = c("TAXA", "GENUS")
GROUP.1 = c("HABITAT")

PROD = c(TAXA.INFO, GROUP.1)
DATE = c("DATE")

AVERAGE.ABUNDANCE = function(x, y, z, a)
  {group_by_(x, y, z) %>%
     summarise_each(funs(mean)) %>%
     ungroup()%>%
     group_by_(a)%>%
     arrange(mdy(z))
  }

XX = AVERAGE.ABUNDANCE(DATA, PROD, DATE, TAXA.INFO)

RESULT
DATE    HABITAT TAXA    GENUS   1   2
06/30/13    Pool    51  A   7   7
06/30/13    Riff    51  A   2   2
07/27/13    Pool    51  A   7   7
07/27/13    Riff    51  A   2   2
06/30/13    Pool    43  B   7   7
06/30/13    Riff    43  B   2   2
07/27/13    Pool    43  B   7   7
07/27/13    Riff    43  B   2   2

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    看起来您的问题出在arrange(mdy(z)) 部分。您需要注意哪些值是字符向量,哪些是可以在数据框上下文中评估的正确符号。您可能会考虑将您的功能更改为

    AVERAGE.ABUNDANCE = function(x, y, z, a) {
         group_by_(x, .dots=c(y, z)) %>%
         summarise_each(funs(mean)) %>%
         ungroup()%>%
         group_by_(.dots=a)%>%
         arrange_(.dots=lazyeval::interp(~mdy(x), x=as.name(z)))
      }
    

    这样就可以了

    AVERAGE.ABUNDANCE(DATA, PROD, DATE, TAXA.INFO)
    #   TAXA GENUS HABITAT     DATE X1 X2
    # 1   43     B    Pool 06/30/13  7  7
    # 2   43     B    Riff 06/30/13  2  2
    # 3   43     B    Pool 07/27/13  7  7
    # 4   43     B    Riff 07/27/13  2  2
    # 5   51     A    Pool 06/30/13  7  7
    # 6   51     A    Riff 06/30/13  2  2
    # 7   51     A    Pool 07/27/13  7  7
    # 8   51     A    Riff 07/27/13  2  2
    

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 1970-01-01
      • 2018-09-24
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      相关资源
      最近更新 更多