在mutate dplyr r中耦合一个函数:计算二阶导数

时间:2018-02-09 13:21:31

标签: r dplyr mutate

我想在我的所有数据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)))

一阶导数(OK):

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

1 个答案:

答案 0 :(得分:2)

diff返回长度比原始vector小1的向量。函数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)))