我如何通过R中的位置和纬度运行thornthwaite函数(计算标准降水指数)?

我如何通过R中的位置和纬度运行thornthwaite函数(计算标准降水指数)?,r,loops,weather,temperature,R,Loops,Weather,Temperature,我有以下数据: dat <- read.table(text=" id YEAR MONTH TMED PRCP lat 1 1986 1 -14.5 2.3 42.4863 1 1986 2 -13.9 5.7 42.4863 2 1986 1 -12.9 7.2 42.46 2 1986 2 -11.6 19.7 42.

我有以下数据:

dat <- read.table(text="
  id YEAR    MONTH   TMED    PRCP    lat
   1  1986    1      -14.5    2.3    42.4863
   1  1986    2      -13.9    5.7    42.4863
   2  1986    1      -12.9    7.2    42.46
   2  1986    2      -11.6    19.7   42.46", header=TRUE)
dat我为我的生态学大师们玩了一点,这个实现看起来有点奇怪。不管它在这里是如何出现的,这个方程需要的不仅仅是平均温度和纬度作为输入。它实际上需要给定月份的平均日长,但这可以通过纬度和日期来计算,而
thornthwaite()
只需假设第一个数据点代表一月,其余数据点按顺序来获取日期。Thornthwaite方程还取决于年度热量指数,这意味着您需要全年的月平均温度
thornthwaite()
通过对您提供的温度向量进行聚合来解决此问题

总之,对于
thornthwaite()
的工作,你需要一个月平均温度序列,从一月开始,至少持续一年。因此,该函数对您提供的数据不起作用

我建议您确保系列足够长,并将其拆分为每个位置的单独data.frames。您可以为此使用
split()
split(dat,dat$id)

?thornthwaite
中有几个示例,其中一个示例演示了它在时间序列上的使用,如果您的时间序列不是从1月份开始的话,这个示例非常有用

我制作了一个模型,演示了一种可能的方法:
(请注意,即使数据没有覆盖一整年,函数也会返回值,这些值将非常不可靠。)


dat请不要发布截图,它们没有帮助。相反,提供示例数据作为代码,以便其他人可以复制并能够提供帮助。完成。谢谢@Pearly Spencer.
thornthwaite()
SPEI
库中的一个吗?是的,这是一个SPEI库@AkselAThank,谢谢你的回复@AksleA!是的,我每年都有所有的月份——我在这里演讲不是为了节省空间。我试过按照你的建议使用分割函数,但我不知道如何在其中包含不断变化的纬度。您是否建议只使用SPEI网格数据集(已由该索引的作者计算)?我想我可以根据我的lat和long提取值。再次感谢!好啊但是这个命令lappy(dat.s,function(x)thornthwaite(x$TMED,x$lat[1])从拆分或原始数据帧中获取纬度的第一个值?@Anastasia:从拆分中获取
split()
返回data.frames的列表,
lappy()
循环遍历此列表,对每个data.frames应用
thornthwaite()
。Thornthwaite的方程只会给你一个非常粗略的潜在蒸散量的近似值。如果你能访问到更可靠的数据,你一定会去的。@Anastasia:没问题。当您发现答案有帮助时,我们鼓励您单击左上角投票箭头下方的符号,为答案打上绿色的“勾选”标记。
library(SPEI)

dat$PET <- thornthwaite(dat$TMED, dat$lat[1])

dat$BAL <- dat$PRCP-dat$PET

spei1 <- spei(dat$BAL, scale = 1)

dat$spei1=l
dat <- read.table(text="
  id YEAR    MONTH   TMED    PRCP    lat
   1  1986    1     -14.5    2.3    42.4863
   1  1986    2     -13.9    5.7    42.4863
   1  1986    3     -10.5    2.3    42.4863
   1  1986    4      -7.9    5.7    42.4863
   1  1986    5      -4.5    2.3    42.4863
   1  1986    6       0.9    5.7    42.4863
   1  1986    7      10.5    2.3    42.4863
   1  1986    8      17.9    5.7    42.4863
   2  1986    1     -12.9    7.2    42.46
   2  1986    2     -11.6   19.7    42.46
   2  1986    3      -8.9    7.2    42.46
   2  1986    4      -5.9    7.2    42.46
   2  1986    5       1.6   19.7    42.46
   2  1986    6      12.9    7.2    42.46
   2  1986    7      21.6   19.7    42.46
   2  1986    8      25.6   19.7    42.46", header=TRUE)

dat.s <- split(dat, dat$id)

lapply(dat.s, function(x) thornthwaite(x$TMED, x$lat[1]))