有没有一种方法可以使用 R 在数据帧上创建循环?

Is there a way I can creates loops over a dataframe with R?

我正在尝试创建一个循环,将平滑函数应用于我感兴趣的所有变量。我使用的数据集是R中的aemet数据集,重点是温度。在第 10 列应用平滑我 运行 以下代码工作正常。

library(fda)
library(fda.usc)
data(aemet,package = "fda.usc")
tt = aemet$temp$argvals
temp = as.data.frame(aemet$temp$data,row.names=F)
range.tt = aemet$temp$rangeval
inv.temp = data.frame(t(aemet$temp$data)) # 365 x 73 matrix
names(inv.temp) = aemet$df$name # Oviedo is the 10th column of inv.temp
ovibasis5 = create.fourier.basis(rangeval = range(tt),nbasis = 5)
ovifourier5.fd = smooth.basis(argvals = tt, y = inv.temp[,i],fdParobj = ovibasis5)$fd
ovi5 = eval.fd(tt,ovifourier5.fd)
ovi5

接下来,我想对数据集中的所有 73 列应用平滑,所以我使用了如下循环函数

for(i in 1: inv.temp){
ovibasis5 = create.fourier.basis(rangeval = range(tt),nbasis = 5)
ovifourier5.fd = smooth.basis(argvals = tt, y = inv.temp[,i],fdParobj = ovibasis5)$fd
ovi5[,i] = eval.fd(tt,ovifourier5.fd)
}
ovi5

但后来我收到此错误消息 “1:inv.temp 中的错误:NA/NaN 参数 另外: 警告信息: 在 1:inv.temp 中:数值表达式有 73 个元素:仅第一个使用 > > ovi5"

我做错了什么?

您可以将 ovibasis5 带出循环,因为它是常量并且不会改变它在循环中的值。使用与 inv.temp.

相同的行数和列数初始化输出矩阵 (ovi5)
library(fda)
library(fda.usc)

ovibasis5 = create.fourier.basis(rangeval = range(tt),nbasis = 5)
ovi5 <- matrix(nrow = nrow(inv.temp), ncol = ncol(inv.temp))

for(i in seq_along(inv.temp)){
  ovifourier5.fd = smooth.basis(argvals = tt, y = inv.temp[,i],fdParobj = ovibasis5)$fd
  ovi5[,i] = eval.fd(tt,ovifourier5.fd)
}
#Sample output
ovi5[1:5, 1:5]

#         [,1]     [,2]     [,3]     [,4]     [,5]
#[1,] 10.99621 9.378179 7.839638 4.930860 5.370917
#[2,] 10.97734 9.360540 7.827852 4.913171 5.365705
#[3,] 10.95973 9.344325 7.817700 4.897670 5.362975
#[4,] 10.94339 9.329520 7.809155 4.884335 5.362678
#[5,] 10.92829 9.316107 7.802192 4.873138 5.364765

#complete output 
ovi5