使用 for 循环 returns 不同值的函数

Function using for loop returns different values

我有一个 for 循环,它 return 是三个连续数据点的最佳拟合斜率。

我的数据:

dput(DIP)
structure(list(DSI = c(4, 6, 8, 10, 12, 14, 16, 18, 20, 22), 
Flask1 = c(0.062, 0.117, 0.33, 0.617, 1.194, 1.855, 1.706, 
    1.537, 1.453, 1.467), Flask2 = c(0.045, 0.133, 0.319, 0.609, 
    1.189, 1.788, 1.616, 1.463, 1.368, 1.396), Flask3 = c(0.045, 
    0.129, 0.327, 0.603, 1.134, 1.658, 1.555, 1.385, 1.34, 1.4
    ), Flask4 = c(0.046, 0.117, 0.308, 0.554, 0.964, 1.478, 1.544, 
    1.34, 1.334, 1.34)), row.names = c(NA, -10L), spec = structure(list(
    cols = list(DSI = structure(list(), class = c("collector_double", 
    "collector")), `Flask 1` = structure(list(), class = c("collector_double", 
    "collector")), `Flask 2` = structure(list(), class = c("collector_double", 
    "collector")), `Flask 3` = structure(list(), class = c("collector_double", 
    "collector")), `Flask 4` = structure(list(), class = c("collector_double", 
    "collector"))), default = structure(list(), class = c("collector_guess", 
    "collector")), delim = ","), class = "col_spec"), problems = <pointer: 0x000001f6ae38ab20>, class = c("spec_tbl_df", 
"tbl_df", "tbl", "data.frame"))

循环:

slopes <- rep(NA, nrow(DIP)-2) 
for( i in 1:length(slopes)){
  slopes[i] <- lm(Flask1 ~ DSI, data=DIP[i:(i+2), ])$coefficients[2]
}

print(slopes)

哪个returns

[1]  0.06700  0.12500  0.21600  0.30950  0.12800 -0.07950 -0.06325 -0.01750

我试图使这个循环成为一个函数,这样我就可以将它用于我数据中的其他列以及其他数据。我试过这个功能:

get_slopes <- function (Data, X, Y) {
  slopes <- rep(NA, nrow(Data)-2) 
  for( i in 1:length(slopes)){
    slopes[i] <- lm(Y ~ X, data=Data[i:(i+2), ])$coefficients[2]
  }
  print(slopes) 
}

但是当我运行

get_slopes(Data = DIP, X = DIP$DSI, Y = DIP$Flask1)

它returns

[1] 0.09684848 0.09684848 0.09684848 0.09684848 0.09684848 0.09684848 0.09684848 0.09684848

我哪里错了?如何将我的函数更改为 return 与循环前置函数相同的值?

试试这个,

get_slopes <- function (Data, X, Y) {
  slopes <- rep(NA, nrow(Data)-2) 
  for( i in 1:length(slopes)){
    slopes[i] <- lm(paste(Y ,"~", X), data=Data[i:(i+2), ])$coefficients[2]
  }
  print(slopes) 
}

然后,

get_slopes(Data = DIP, X = "DSI", Y = "Flask1")

或者,您可以使用 purrr::map_dbl() 函数,例如

get_slopes  <- function(Data, X, Y) {
  
purrr::map_dbl(1:length(Data), ~ lm(paste(Y, "~", X), data=Data[.x:(.x+2), ])$coefficients[2])
}

get_slopes(Data = DIP, X = "DSI", Y = "Flask1")
[1] 0.0670 0.1250 0.2160 0.3095 0.1280