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

问题描述

我正在尝试构建一个函数,该函数将方程式应用于变量的每一行并将输出粘贴到数据帧的另一列中。这是我第一次尝试构建函数的第一步,但我完全陷入了困境。该函数将创建几个列,然后将方程式应用于这些列。到目前为止,我已经:

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

测试代码将返回我所需要的内容,但是等式(data $ al列)仅应用于顶部行并向下粘贴该列。

我已经进行了非常艰苦的搜索,似乎我可以创建一个仅方程式的函数,并使用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,annual_layer=(mo/ko)*log((1+ko*t2)/(1+ko*t1))) %>% select(-t)
}
,

通常,我建议编写一个对 vectors 起作用并返回 vector 的函数,因为它几乎可以用于任何其他用途,并且可以根据需要进行分组无需修改。在此示例中(未试用):

cpeat <- function(t1,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)透明地工作。

如果需要它返回所有三列以供参考,则可以使用与已经拥有的内容相似的东西,但仍使用向量:

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

这可以在基数R,tidyverse等中直接使用:

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

注意:如果在已经存在任何名称的情况下执行此操作,则可能会遇到问题(例如,预先分配名称)。

,

我认为您可以只使用apply函数,因此它看起来像:

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...