首页 > 解决方案 > R 循环:每 3 行执行一个函数

问题描述

我有 2000 株小麦,在 40 天内生长。我想对每个植物执行 coeff 函数,以找到 3 个时间点产生的二次方程的系数。(a、b 和 c)

(1) 该coef(lm(y~poly(x,2,raw=TRUE))功能完全按照我想要的方式工作。

(2) 但是,我的数据呈现方式需要我手动设置 x 和 y。

(3) 因此,我融化了我的数据,并订购了它。

(4) 我想制作一个循环,将“Day”列中的前三个设置为 x。然后我希望它采用“高度”列中的前三个并将其设置为 y。

然后我想执行 coeff 功能。

最后我希望它呈现我需要的系数输出,最好是在一个新的数据表中。

然后对所有小麦植物每三行重复一次,它们代表每个小麦 ID。

1)这个函数有效,给我系数:a,b,c

x<-c(1,2,3)
y<-c(1,10,4)
coef(lm(y~poly(x,2,raw=TRUE)))

2)这就是我的数据最初的样子

A = matrix(c(5, 4, 2, 10, 10, 4, 5, 15, 6),nrow=3, ncol=3)
colnames(A)<-c("10", "25", "40")
rownames(A)<-c("Wheat 1", "Wheat 2", "Wheat 3")
A

3)这是我的融化格式

A.melted<-as.data.frame(melt(A, id.vars="ID"))
A.melted<-A.melted[with(A.melted,order(Var1)),]
colnames(A.melted) <- c("WheatID", "Day", "Height")
A.melted$Day<-as.numeric(as.character(A.melted$Day))
A.melted
#

4)这就是我试图用我的循环做的......

我只是不熟悉循环的语法,我喜欢任何提示和建议。仔细阅读 Google 告诉我,除非绝对需要,否则不应执行循环,因为我可能会遇到更多问题 - 因此我也对非循环技术持开放态度。

标签: rloopsdataframedata-manipulation

解决方案


或者您可以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

或者您可以转置数据并coef(...)直接使用调用:

x <- as.numeric(colnames(A))
coef(lm(t(A) ~ poly(x, 2, raw = TRUE)))

推荐阅读