簡體   English   中英

在mutate dplyr r內耦合一個函數:計算二階導數

[英]Couple a function inside mutate dplyr r: Calculate second derivative

我想對所有數據grouped_by(id)計算以下公式

$$\frac{y''}{((1+(y')^2)^{3/2}}$$

我陷入了通過mutate傳遞函數的困境,因為它給了我不相等的列大小。

樣本數據為:

require(dplyr)

df<-data.frame(Time=seq(65),
               SkinTemp=rnorm(65,37,0.5),
               id=rep(1:10,c(5,4,10,6,7,8,9,8,4,4)))

一階導數(確定):

df <-df %>% group_by(id) %>% filter(n() > 1) %>%
  mutate(first_d = SkinTemp - lag(SkinTemp))
df<-as.data.frame(df)  #Back to data frame

二階導數(卡住):

drv <- function(x, y) diff(y) / diff(x) #Defined this to pass to mutate

middle_pts <- function(x) x[-1] - diff(x) / 2 

second_d <-df %>% group_by(id)  %>%
  mutate(second_d = drv(middle_pts(Time), drv(Time, SkinTemp)))

diff返回一個長度比原始vector短一向量的vector 函數mutate要求列返回相同的長度。 因此,我們需要對NA或選擇值做一些補充

drv <- function(x, y) c(NA, (diff(y) /diff(x))) 
middle_pts <- function(x) c(NA, (x[-1] - diff(x) /2))

現在,OP的代碼應該可以正常工作

df %>%
   group_by(id)  %>%
   mutate(second_d = drv(middle_pts(Time), drv(Time, SkinTemp)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM