2016-07-26 117 views
2

我试图在dplyrsummarise中使用用户定义的函数。 我的工作可以downloaded here和使用下面的代码准备向使用DataSet:dplyr中的R用户定义函数汇总

raw_data <- read.csv("Output/FluxN2O.csv", stringsAsFactors = FALSE) 
test_data <- raw_data %>% mutate(Chamber = as.factor(Chamber), Treatment = as.factor(Treatment. Time = as.POSIXct(Time, format = "%Y-%m-%d %H:%M:%S"))) 

这里是head()

> head(test_data) 
      Time Chamber_closed   Slope R_Squared Chamber Treatment Flux_N2O Time_relative Time_cumulative 
1 2016-05-03 00:08:21   10.23 8.873843e-07 0.6941540  10  AN 0.7567335   0.0    0.0 
2 2016-05-03 06:10:21   12.24 -5.540907e-06 0.7728001  12   U -4.7251117   362.0   362.0 
3 2016-05-03 06:42:21   10.24 -5.260463e-06 0.9583473  10  AN -4.4859581   32.0   394.0 
4 2016-05-03 07:12:21   9.23 -5.320429e-06 0.7602987  9  IU -4.5370951   30.0   424.0 
5 2016-05-03 07:42:21   7.23 3.135043e-06 0.7012436  7   U 2.6734669   30.0   454.0 
6 2016-05-03 20:10:15   5.24 5.215290e-06 0.7508935  5  AN 4.4474364   747.9   1201.9 

对于因素Chamber的每一层,我要计算的当x = Time_cumulative和y = Flux_n2O时曲线下面积。

我可以使用下面的函数传递给by调用做到这一点:

cum_ems_func <- function(x) {last(cumtrapz(x$Time_cumulative, x$Flux_N2O))} 
by(test_data, test_data$Chamber, cum_ems_func) 

不过,我更愿意用dpylr因为有工作要做,这将使用summarise输出是最容易进一步的数据处理。

当我尝试使用dplyr方法

test_data %>% 
group_by(Chamber) %>% 
summarise(cumulative_emmission = last(cumtrapz(Time_cumulative, Flux_N2O))) 

我收到以下错误:

Error: Unsupported vector type language 

我已经使用了总结通话中的用户定义函数cums_ems_func用得到的也试过错误:

test_data %>% 
group_by(Chamber) %>% 
summarise(cumulative_emmission = cum_ems_func()) 
Error: argument "x" is missing, with no default 

任何人都可以点我这个请正确的方向?

+0

请加上'dput(头(TEST_DATA))'你的问题 –

+0

最后一种方法需要你传递给函数的一些数据之一,但是按照你定义它的方式,它将需要整个data.frame组,它用'.'表示。如果你喜欢,你可以重新定义函数来取两个变量,所以你可以传递列名。以前的版本更常见,应该尽我所能地工作。什么是'cumtrapz'函数,它的参数是什么? – alistaire

+0

@alistaire'cumtrapz'是通过梯形积分计算曲线下面积的函数。它是“pracma”包的一部分。我曾尝试过使用'.',但它给了我'Chamber'因子的每个级别相同的值。我将改变功能。 –

回答

0

如果我理解正确,那么下面应该做的工作

library(pracma); library(dplyr) 


test_data <- test_data %>% group_by(Chamber) %>% 
      mutate(emission=max(cumtrapz(Time_cumulative, Flux_N2O))) %>% ungroup 

### or 

test_data <- test_data %>% group_by(Chamber) %>% 
      mutate(cumulative_emission=cumtrapz(Time_cumulative, Flux_N2O)) %>% ungroup