首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R循环:每3行执行一次函数

R循环:每3行执行一次函数
EN

Stack Overflow用户
提问于 2019-07-05 21:33:43
回答 4查看 718关注 0票数 3

我有2000株小麦,在40天的时间里生长。我想对每个对象执行coeff函数,以求出三个时间点产生的二次方程的系数。(a、b和c)

(1) coef(lm(y~poly(x,2,raw=TRUE))函数的工作方式与我所希望的完全一致。

(2)然而,由于数据的显示方式,需要手动设置x和y。

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

(4)我想做一个循环,把前三列的“日”设为x,然后把前三列的“高度”设为y。

那么我想要执行coeff函数。

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

然后,每三行重复,代表每个小麦ID,所有小麦植株。

1)这个函数工作,给我系数: a,b,c

代码语言:javascript
复制
x<-c(1,2,3)
y<-c(1,10,4)
coef(lm(y~poly(x,2,raw=TRUE)))

2)这就是我最初的数据

代码语言:javascript
复制
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)这是我的熔解格式

代码语言:javascript
复制
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)这就是我想用我的循环做的.

  • 每3行,
  • x<-A.melted[,2]
  • y<-A.melted[,3]
  • coef(lm(y~poly(x,2,raw=TRUE)))
  • 编译系数的东西: a,b,c

我只是不熟悉循环的语法,我喜欢任何提示和建议。仔细阅读谷歌告诉我,一个人不应该做循环,除非它是绝对必要的,因为我可能会遇到更多的问题-因此,我是开放的非循环技术以及。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-07-05 22:25:28

如果您想在一个循环中这样做,请尝试以下操作。关键的部分是使用seq和一个by =参数来让索引执行所需的步骤。

代码语言:javascript
复制
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.table的人。因此,我向您提供一个tibble

票数 0
EN

Stack Overflow用户

发布于 2019-07-05 22:25:14

我们可以在data.table的帮助下完成这一任务,请参阅?data.table

代码语言:javascript
复制
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]

您可以像这样访问每个模型:

代码语言:javascript
复制
A.models[WheatID == "Wheat 1", model[[1]]]

甚至

代码语言:javascript
复制
A.models[WheatID == "Wheat 1", summary(model[[1]])]

之所以会发生这种情况,是因为data.table引入了J 表达式,而不仅仅是函数。

票数 0
EN

Stack Overflow用户

发布于 2019-07-05 22:39:22

这是您可以用data.table包做的事情。

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56909459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档