【问题标题】:Is there a way I can creates loops over a dataframe with R?有没有办法可以用 R 在数据帧上创建循环?
【发布时间】:2023-04-08 03:23:01
【问题描述】:

我正在尝试创建一个循环,该循环将对我所有感兴趣的变量应用平滑函数。我使用的数据集是 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"

我做错了什么?

【问题讨论】:

  • 你可以试试seq_len(ncol(inv.temp)) 而不是1:inv.temp
  • 嗨。如果您可以分享,那就太好了:stackoverflow.com/help/minimal-reproducible-example 除此之外,您的inv-temp 是一个具有列和行的数据框,而 for 循环需要一个单维向量,即该数据框的列数。
  • @MartinGal ...或者更简洁一点,seq_along(inv.temp)
  • @r2evans 当然你是对的。我根本记不起这个顺序是沿列还是沿行...也许现在我可以...
  • @MartinGal 我得到同样的错误信息

标签: r dataframe data-science


【解决方案1】:

您可以将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

【讨论】:

  • 感谢您的详细说明。成功了!
猜你喜欢
  • 2011-09-08
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
相关资源
最近更新 更多