【问题标题】:Questions for Loop in R (solution found)R中的循环问题(找到解决方案)
【发布时间】:2020-01-12 02:45:03
【问题描述】:

我有一个代码适用于一个包含一年温度数据的数据框。

我正在尝试编写一个循环来将我的代码应用于多个数据集(目前只有两个 -> 所以两个国家)。为此,我使用以下方法将年度国家数据(csv 文件)作为列表读取:

setwd("/Users/lisak/Desktop/WeatherDataFiles")
files <- list.files(path=getwd(), pattern=".csv")
dfList <- lapply(files, function(f) {
  df <- read.csv(f, header=TRUE)
})

通过我的循环,我正在尝试创建一个新变量(每个气象站的月平均温度 (STN_NAME)),该变量有效(我收到一个包含 2 个 yearlymean 数据框的列表)。 但是当我执行第二个循环将数据拆分为月份时,我会收到一个包含 2 个数据帧的列表,但它们都包含来自循环中最后一个数据集的数据。

yearlymean <- list()
monthlymean <- list()
for (i in 1:length(dfList)) {
  yearlymean[[i]] <- aggregate((dfList[[i]])[,"MAX"] ,list(STN_NAME=(dfList[[i]])$STN_NAME, MONTH=(dfList[[i]])$MONTH), mean)
  for (j in 1:length(yearlymean)) {
  monthlymean[[j]]  <- split(yearlymean[[i]], as.factor((yearlymean[[i]])$MONTH))
 }
  }

我不确定我在第二个循环中缺少什么,因此它不会保存第一个数据帧的拆分数据。 另外,有没有更好的编码方式? 谢谢

整个代码:

library(GSODR)
Moz <- get_GSOD(years = 2015, country = "Mozambique") # retreiving data from package
Zim <- get_GSOD(years = 2015, country = "Zimbabwe")   # retreiving data from package
write.csv(Moz, file ="Mozambique_2015.csv") # saving data to WeatherDataFiles folder
write.csv(Zim, file = "Zimbabwe_2015.csv")  # saving data to WeatherDataFiles folder

setwd("/Users/lisak/Desktop/WeatherDataFiles")
files <- list.files(path=getwd(), pattern=".csv")
dfList <- lapply(files, function(f) {
  df <- read.csv(f, header=TRUE)

yearlymean <- list()
monthlymean <- list()
for (i in 1:length(dfList)) {
  yearlymean[[i]] <- aggregate((dfList[[i]])[,"MAX"] ,list(STN_NAME=(dfList[[i]])$STN_NAME, MONTH=(dfList[[i]])$MONTH), mean)
  for (j in 1:length(yearlymean)) {
  monthlymean[[j]]  <- split(yearlymean[[i]], as.factor((yearlymean[[i]])$MONTH))
 }
  }
})

【问题讨论】:

    标签: r loops for-loop lapply


    【解决方案1】:

    鉴于我不完全了解您的数据的外观,我不确定这是否可行。 下面,我假设这个结构:

      year month day        temp
    1 2000     1   1 -0.17489752
    2 2000     1   2 21.70812842
    3 2000     1   3 -6.39391558
    4 2000     1   4 -0.05699615
    5 2000     1   5  4.37288935
    6 2000     1   6  0.20555128
    

    然后我会使用 data.table 包。使用bigtable = rbindlist(list),您可以对列表中的所有表进行行绑定。 下一步很简单

    #for yearly mean
    bigtable[, .(mean = mean(temp)), by = c("year")]
    # for monthly mean
    bigtable[, .(mean = mean(temp)), by = c("month")]
    

    如果这就是您要找的,请告诉我。

    【讨论】:

    • 感谢您的帮助!我的问题中缺少一些东西,不是很清楚。我的问题更多是关于循环,尤其是第二个 for 循环,我的列表中没有 2 个唯一的数据帧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 2022-10-24
    相关资源
    最近更新 更多