Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R循环:每3行执行一个函数_R_Loops_Dataframe_Data Manipulation - Fatal编程技术网

R循环:每3行执行一个函数

R循环:每3行执行一个函数,r,loops,dataframe,data-manipulation,R,Loops,Dataframe,Data Manipulation,我有2000株小麦,在40天的时间里生长。 我想对每个设备执行系数函数,以找到三个时间点形成的二次方程的系数。(a、b和c) (1) coef(lm(y~poly(x,2,raw=TRUE))函数的工作方式完全符合我的要求 (2) 但是,我的数据显示方式要求我手动设置x和y (3) 因此,我融化了我的数据,并对其进行了排序 (4) 我想做一个循环,取“Day”列中的前三个,并将其设置为x。然后我想取“Height”列中的前三个,并将其设置为y 然后我想执行coeff函数 最后,我想让它展示我需要

我有2000株小麦,在40天的时间里生长。 我想对每个设备执行系数函数,以找到三个时间点形成的二次方程的系数。(a、b和c)

(1)
coef(lm(y~poly(x,2,raw=TRUE))
函数的工作方式完全符合我的要求

(2) 但是,我的数据显示方式要求我手动设置x和y

(3) 因此,我融化了我的数据,并对其进行了排序

(4) 我想做一个循环,取“Day”列中的前三个,并将其设置为x。然后我想取“Height”列中的前三个,并将其设置为y

然后我想执行coeff函数

最后,我想让它展示我需要的系数输出,最好是在一个新的数据表中

然后对所有小麦植株每三行重复一次,这三行代表每个小麦ID

1) 这个函数起作用,给我一个系数:a,b,c
x我们可以借助data.table来完成此操作,请参见
?data.table

library(data.table)

A.models = A.melted[, model := list(.(lm(Height ~ poly(Day, 2), 
                                         data = list(.(.SD[WheatID == .BY[[1]]]))))), 
                    by = WheatID] 

A.models[, coefs := list(.(coefficients(model[[1]]))), 
         by = WheatID]
您可以通过以下方式访问每个模型:

A.models[WheatID == "Wheat 1", model[[1]]]
甚至

A.models[WheatID == "Wheat 1", summary(model[[1]])]

这里的神奇之处在于
数据。table
接受
J
表达式,而不仅仅是函数。

如果您想在循环中执行此操作,请尝试此方法。关键部分是将
seq
by=
参数一起使用,让索引执行所需的步骤

library(tibble)

df <- tibble(
  WheatID = rep(NA_character_, nrow(A)),
  Intercept = rep(NA_real_, nrow(A)),
  poly1 = rep(NA_real_, nrow(A)),
  poly2 = rep(NA_real_, nrow(A))
)
cnt <- 1
for (i in seq(1, nrow(A.melted), by = 3)) {
  x <- A.melted$Day[i + 0:2]
  y <- A.melted$Height[i + 0:2]
  df$WheatID[cnt] <- as.character(A.melted$WheatID[i])
  df[cnt, 2:4] <- coef(lm(y~poly(x,2,raw=TRUE)))
  cnt <- cnt + 1
}
df
库(TIBLE)

df这是您可以使用data.table包执行的操作

data.list <- split(A.melted, f = (1:nrow(A.melted) - 1) %/% 3)
coefs <- lapply(data.list, function(x) {
  coefs <- coef(lm(Day ~ poly(Height, raw=TRUE), data = x))
  data.table(
    intercept = coefs[1],
    poly.height = coefs[2]
  )
})

coefs <- rbindlist(coefs)

data.list或者您可以直接在原始矩阵上执行
apply()

x <- as.numeric(colnames(A))
apply(A, 1, function(y) coef(lm(y~poly(x,2,raw=TRUE))))

                            Wheat 1      Wheat 2       Wheat 3
(Intercept)             -3.88888889 -0.555555556  6.666667e-01
poly(x, 2, raw = TRUE)1  1.11111111  0.477777778  1.333333e-01
poly(x, 2, raw = TRUE)2 -0.02222222 -0.002222222 -2.417315e-18

再次感谢您的回答!但假设我现在想找到每条二次曲线下的面积?最好的方法是什么?这个话题与这个问题没有直接关系。有一种精确的方法可以找到二次多项式的积分函数,它相对容易,并且可以在感兴趣的范围内计算。我不知道,怎么做,继续问。还有一种数值方法,即在感兴趣的区域内生成随机点,得到低于多项式的比例。
library(tibble)

df <- tibble(
  WheatID = rep(NA_character_, nrow(A)),
  Intercept = rep(NA_real_, nrow(A)),
  poly1 = rep(NA_real_, nrow(A)),
  poly2 = rep(NA_real_, nrow(A))
)
cnt <- 1
for (i in seq(1, nrow(A.melted), by = 3)) {
  x <- A.melted$Day[i + 0:2]
  y <- A.melted$Height[i + 0:2]
  df$WheatID[cnt] <- as.character(A.melted$WheatID[i])
  df[cnt, 2:4] <- coef(lm(y~poly(x,2,raw=TRUE)))
  cnt <- cnt + 1
}
df
data.list <- split(A.melted, f = (1:nrow(A.melted) - 1) %/% 3)
coefs <- lapply(data.list, function(x) {
  coefs <- coef(lm(Day ~ poly(Height, raw=TRUE), data = x))
  data.table(
    intercept = coefs[1],
    poly.height = coefs[2]
  )
})

coefs <- rbindlist(coefs)
x <- as.numeric(colnames(A))
apply(A, 1, function(y) coef(lm(y~poly(x,2,raw=TRUE))))

                            Wheat 1      Wheat 2       Wheat 3
(Intercept)             -3.88888889 -0.555555556  6.666667e-01
poly(x, 2, raw = TRUE)1  1.11111111  0.477777778  1.333333e-01
poly(x, 2, raw = TRUE)2 -0.02222222 -0.002222222 -2.417315e-18
x <- as.numeric(colnames(A))
coef(lm(t(A) ~ poly(x, 2, raw = TRUE)))