功能失调....dplyr 在自定义函数中没有 运行 函数
Dysfunctional....dplyr functions not running in custom function
对于我的研究,我 assemble 各种大小(100 到 50000 行)和复杂性(2 到 6 个分组变量)的数据集,但经常对所有数据集进行相同的计算。我经常编写特定于每个数据集的 R 代码,但这变得非常耗时。现在我正在尝试编写灵活的函数来执行计算。我对包 dplyr
感到满意,但在将 dplyrs
函数合并到我的自定义函数中时遇到了问题。欢迎任何一般性建议,但以下是我目前的问题。
我试图让这个例子尽可能真实,所以我希望这个例子清楚地阐明了我当前的问题。我正在尝试将具有 4 个分组变量的 DATA
提供给一个函数,该函数计算每个 TAXA
、GENUS
、HABITAT
和 DATE
的平均值。然后我需要在每个 TAXA
和 GENUS
中排列 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
看来您的问题出在 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
对于我的研究,我 assemble 各种大小(100 到 50000 行)和复杂性(2 到 6 个分组变量)的数据集,但经常对所有数据集进行相同的计算。我经常编写特定于每个数据集的 R 代码,但这变得非常耗时。现在我正在尝试编写灵活的函数来执行计算。我对包 dplyr
感到满意,但在将 dplyrs
函数合并到我的自定义函数中时遇到了问题。欢迎任何一般性建议,但以下是我目前的问题。
我试图让这个例子尽可能真实,所以我希望这个例子清楚地阐明了我当前的问题。我正在尝试将具有 4 个分组变量的 DATA
提供给一个函数,该函数计算每个 TAXA
、GENUS
、HABITAT
和 DATE
的平均值。然后我需要在每个 TAXA
和 GENUS
中排列 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
看来您的问题出在 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