首页 > 解决方案 > 在 r 中循环运行脚本

问题描述

我需要为每个站点运行一个脚本(我在脚本中将数字 1 替换为 1),但是有 100 多个站点。

我想也许脚本中的循环可以节省我的时间。以前从未做过循环,不知道是否可以做我想做的事。我已经尝试过如下方式,但不起作用。

只是我的一些 df8 数据(txt):

RowNum,date,code,gauging_station,precp
1,01/01/2008 01:00,1586,315,0.4
2,01/01/2008 01:00,10990,16589,0.2
3,01/01/2008 01:00,17221,30523,0.6
4,01/01/2008 01:00,34592,17344,0
5,01/01/2008 01:00,38131,373,0
6,01/01/2008 01:00,44287,370,0
7,01/01/2008 01:00,53903,17314,0.4
8,01/01/2008 01:00,56005,16596,0
9,01/01/2008 01:00,56349,342,0
10,01/01/2008 01:00,57294,346,0
11,01/01/2008 01:00,64423,533,0
12,01/01/2008 01:00,75266,513,0
13,01/01/2008 01:00,96514,19187,0

代码:

station <- sample(50:150,53,replace=F)

        for(i in station) 
          {

        df08_1 <- filter(df08, V7==station [i])

        colnames(df08_1) <- c("Date","gauging_station", "code", "precp")


        df08_1 <- unique(df08_1)


        final <- df08_1 %>%
          group_by(Date=floor_date(Date, "1 hour"), gauging_station, code) %>%
          summarize(precp=sum(precp))


        write.csv(final,file="../station [i].csv", row.names = FALSE)

    }

标签: rtidyverse

解决方案


如果您不反对使用某些tidyverse软件包,我认为您可以简化一下:

使用您的新示例数据更新 - 这在我的计算机上运行正常:

代码:

library(dplyr)

dat %>%
  select(-RowNum) %>%
  distinct() %>% 
  group_by(date_hour = lubridate::floor_date(date, 'hour'), gauging_station, code) %>%
  summarize(precp = sum(precp)) %>%
  split(.$gauging_station) %>%
  purrr::map(~write.csv(.x,
                        file = paste0('../',.x$gauging_station, '.csv'),
                        row.names = FALSE))

数据:

dat <- data.table::fread("RowNum,date,code,gauging_station,precp
                  1,01/01/2008 01:00,1586,315,0.4
                  2,01/01/2008 01:00,10990,16589,0.2
                  3,01/01/2008 01:00,17221,30523,0.6
                  4,01/01/2008 01:00,34592,17344,0
                  5,01/01/2008 01:00,38131,373,0
                  6,01/01/2008 01:00,44287,370,0
                  7,01/01/2008 01:00,53903,17314,0.4
                  8,01/01/2008 01:00,56005,16596,0
                  9,01/01/2008 01:00,56349,342,0
                  10,01/01/2008 01:00,57294,346,0
                  11,01/01/2008 01:00,64423,533,0
                  12,01/01/2008 01:00,75266,513,0
                  13,01/01/2008 01:00,96514,19187,0") %>%
  mutate(date = as.POSIXct(date, format = '%m/%d/%Y %H:%M'))

推荐阅读