2016-07-26 3 views
2

Я пытаюсь использовать пользовательскую функцию в пределах dplyrsummarise. Набор данных я работаю может быть downloaded here и нацелен на использование, используя следующий код:R пользовательская функция в dplyr summary

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, я хочу, чтобы вычислить площадь под кривой при х = 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». Я попытался использовать '.', но он дал мне то же значение для каждого уровня фактора« Камера ». У меня будет возможность изменить функцию. –

ответ

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 
Смежные вопросы