R循环:每3行执行一个函数
我有2000株小麦,在40天的时间里生长。 我想对每个设备执行系数函数,以找到三个时间点形成的二次方程的系数。(a、b和c) (1)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函数 最后,我想让它展示我需要
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)))