创建将方程式应用于每一行的用户定义函数

Creating a user defined function that applies an equation to each row

我正在尝试构建一个函数,将方程应用于变量的每一行并将输出粘贴到数据框的另一列中。这是我第一次尝试构建函数的第一步,我完全被卡住了。该函数创建了几个列,然后应将方程应用于这些列。到目前为止我有:

cpeat <- function(data, mo, ko) { 
  data$t1 <- data$t
  data$t2 <- lead(data$t1)
  data$al <- ((mo/ko)*log((1+ko*t2)/(1+ko*t1)))
data.frame("t1" = data$t1, 
           "t2" = data$t2,
           "annual_layer" = data$al)
}

正在测试我需要的代码returns,但公式(data$al 列)仅应用于顶行并粘贴到列下方。

我搜索得很辛苦,似乎我可以创建一个完全是方程式的函数,然后使用 apply,但这只是一个开始,最终可能会成为一个复杂的函数,所以我需要正确创建列。

非常感谢任何帮助, 干杯。

我想你可以只使用 apply 函数,所以它看起来像:

apply(data, 1, cpeat(data, mo, ko))?

https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/apply

不用写函数,你已经在用dplyr了,为什么不充分利用呢?

# df is the data.frame you had
# you have to set mo and ko in the global environment ie mo=.9; ko=0.7
df %>% mutate(t1=t, t2=lead(t), annual_layer=(mo/ko)*log((1+ko*t2)/(1+ko*t1)))

编辑

cpeat <- function(data, mo, ko) {
     if(!require(dplyr)){
          install.packages("dplyr")
          library(dplyr)
     }
     data %>% mutate(t1=t, t2=lead(t), annual_layer=(mo/ko)*log((1+ko*t2)/(1+ko*t1))) %>% select(-t)
}

一般来说,我建议编写一个函数,它可以处理 vectors 和 returns a vector,因为它可以如果需要,无需修改即可应用于任何其他用途和分组。在这个例子中(未经测试):

cpeat <- function(t1, mo, ko) (mo/ko)*log((1+ko*lead(t1))/(1+ko*t1))
data$annual_layer <- cpeat(data$t, data$mo, data$ko)

这足够通用,几乎可以在任何情况下透明地工作(base、tidyverse、data.table)。

如果您需要它 return 所有三列以供参考,那么您可以使用与您已有的类似的东西,但仍然使用向量:

cpeat <- function(t1, mo, ko) {
  t2 <- lead(t1)
  data.frame(
    t1 = t1, t2 = t2,
    out = (mo/ko)*log((1+ko*t2)/(1+ko*t1))
  )
}

这可以在 base R、tidyverse 中使用……相当直接:

# base R
cbind(dat, with(dat, cpeat(t, mo, ko)))
# tidyverse
dat %>%
  bind_cols(cpeat(.$t, .$mo, .$ko))

注意:如果在任何名称已经存在的情况下执行此操作,可能 运行 会出现问题(例如,具有名称 pre-assigned)。