【问题标题】:Creating new vectors that are annual averages from monthly vectors using a loop in R使用 R 中的循环从每月向量创建新向量,这些向量是年平均值
【发布时间】:2020-03-07 01:17:47
【问题描述】:

我有以下 MWE:

list <- c("Canada","USA","Brazil","China","Germany","Spain","France","UK","India","Iran",
"Italy","Japan","Mexico","Nederlands","Norway","NZ","Philippines","Poland","Russia","Sweden","Ukraine")

#What I want to do is something like this (although this doesn't do it):
avg_Canada <- sum(Canada[1:12], Canada>0) / length(Canada[1:12, Canada>0)
   > Error in Canada[1:12, Canada > 0] : incorrect number of dimensions

#My idea for the loop
subsets <- c("1:12","13:24","25:36","37:48","49:60","61:72","73:84") #each year

for (c in seq_along(list)) {
   avg_c <- rep(1:7) #create a new vector with 7 elements for each country
   for (i in seq_along(subsets)) {
      #here go through subsets and store 7 values in each of avg_c
   }
}

我想获取list 中的每个向量(它们是num [1:84])并创建一个新向量,取它们的子集的平均值。这是因为每个中包含的数据是月度数据,我需要将其转换为年度数据。遗憾的是,我无法将向量包含在 MWE 中。例如,当我尝试创建avg_Canada 时,我只是在第一年而不是所有年份都尝试这样做,所以我认为每年都有一个循环适合。此外,正如你所知道的,我有很多国家。

我的命名方案在第一个嵌套循环中不正确,我对如何在第二个嵌套循环中创建 avg_c 变量一无所知,但我相信我的直觉在 avg_Canada“尝试”中被捕获你甚至可以这样称呼它。想知道这是否是解决此问题的方法。

【问题讨论】:

    标签: r loops vector


    【解决方案1】:

    我们可以使用mget 获取列表中的所有list 国家,并使用by 获取列表中每12 个元素的mean

    lapply(mget(list), function(x) as.numeric(by(x, rep(1:7, each  = 12), mean)))
    

    这将返回一个长度为 length(list) 的列表,其中每个元素都是大小为 7 的数字向量。

    【讨论】:

    • 这会进入循环内部吗?另外,我将如何解释我想忽略的 -9999 值?例如如果其中一个平均值中的一个值为 -9999,我将如何使其仅取 12 个值中的 11 个/除 -9999 之外的所有值的平均值?
    • @Brennan 使用lapply 我认为更简单。您可以通过lapply(mget(list), function(x) as.numeric(by(x, rep(1:7, each = 12), function(y) mean(y[y != -9999])))) 忽略 -9999 值
    • 最后一个参数似乎不起作用,但替换 mean(y[y &gt; 0]) 似乎可以解决问题!感谢您的努力,我希望这对以后遇到类似问题的其他人有价值
    • 我如何将这些作为向量保存在环境中?
    • 您可以将输出存储在对象result &lt;- lapply(mget(list), function(x)....rest of the code 中,然后执行list2env(result, .GlobalEnv)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2021-04-11
    • 2014-08-05
    • 2021-12-17
    • 1970-01-01
    相关资源
    最近更新 更多