2016-07-26 28 views
2

Ich versuche, eine benutzerdefinierte Funktion innerhalb dplyrsummarise zu verwenden. Der Datensatz an dem ich arbeite downloaded here und vorbereitet für die Verwendung mit dem folgenden Code sein kann:R benutzerdefinierte Funktion in dplyr zusammenfassen

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"))) 

Hier ist die 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 

Für jede Stufe des Faktors ist Chamber, möchte ich das berechnen Fläche unter der Kurve, wenn x = Time_cumulative und y = Flux_n2O.

Ich kann dies tun, um die folgende Funktion zu einem by Aufruf übergeben werden:

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

Allerdings würde ich es vorziehen, dpylr zu verwenden, da es weitere Datenverarbeitung ist zu tun, was am einfachsten sein wird, die summarise Ausgabe mit .

Wenn ich versuche, die dplyr Ansatz zu verwenden

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

bekomme ich folgende Fehlermeldung:

Error: Unsupported vector type language 

ich auch versucht haben, mit der benutzerdefinierten Funktion cums_ems_func im summarise Anruf mit dem resultierenden Fehler:

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

Kann mir jemand zeigen die richtige Richtung damit bitte?

+0

Bitte fügen Sie 'dput (Kopf (test_data))' zu Ihrer Frage –

+0

Der letzte Ansatz muss die Funktion einige Daten zu übergeben, aber so, wie Sie es definiert haben, wird es die gesamte Gruppe von data.frame benötigen, die durch '.' repräsentiert wird. Sie könnten die Funktion neu definieren, um zwei Variablen zu verwenden, wenn Sie möchten, so dass Sie einfach Spaltennamen übergeben können. Die vorherige Version ist häufiger und sollte so weit funktionieren, wie ich sagen kann. Was ist die 'cumtrapz' Funktion, und was sind ihre Parameter? – alistaire

+0

@alistaire 'cumtrapz' ist eine Funktion zur Berechnung der Fläche unter einer Kurve durch trapezförmige Integration. Es ist Teil des "Pracma" -Pakets. Ich habe versucht, '.' zu verwenden, aber es gab mir den gleichen Wert für jede Stufe des 'Kammer'-Faktors. Ich werde versuchen, die Funktion zu ändern. –

Antwort

0

Wenn ich richtig dann eine der folgenden verstehen sollte die Arbeit machen

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 
Verwandte Themen