首页 > 解决方案 > R:循环在 R 中创建新的数据帧

问题描述

我正在尝试创建一个循环,为 VCS 站创建许多文件,这些文件根据其站名命名。下面是为一个站执行此操作的代码,我试图将其变成一个循环,以便可以为 68 个站执行此操作。(即,如果我正在复制和粘贴,我将用不同的电台名称替换 P205187,例如 P205200)。我在一个名为 VCS.Sites 的数据框中有单独的电台名称(例如 P205187)。谁能指出我正确的方向?新的 R 用户在这里,我被困住了!

P205187 <- VCSrawdata[VCSrawdata$Network_ID=="P205187",]  #create a file for VCS station P205187
  #clean up after subset
  P205187$Network_ID <- factor(P205187$Network_ID)


# create annual file for VCS station P205187
P205187_annual <- group_by(P205187,Year,DESCRIPTION)
P205187_annual <- summarise(P205187_annual,Sum_Annual = sum(Value), Mean_Annual = mean(Value), CountDays=n())

# create monthly file for VCS station P205187
P205187_monthly <- group_by(P205187,Year, Month,DESCRIPTION)
P205187_monthly <- summarise(P205187_monthly,Sum_Monthly = sum(Value),Mean_monthly = mean(Value),CountDays=n())

标签: rloops

解决方案


只需在定义的方法中概括您的过程,然后将站点名称作为参数传递给循环或应用函数来迭代站点。使用这种方法,您可以避免许多单独的对象淹没全局环境,而是使用许多底层元素的单个命名列表来更好地序列化和组织。

summarize_stations <- function(station_name) { 

   tmp_df <- VCSrawdata[VCSrawdata$Network_ID==station_name,] 
   tmp_df$Network_ID <- factor(tmp_df$Network_ID) 

   # create annual file for VCS station
   tmp_annual <- summarise(group_by(tmp,Year,DESCRIPTION),
                           Sum_Annual = sum(Value), 
                           Mean_Annual = mean(Value), 
                           CountDays=n()) 

   # create monthly file for VCS station
   tmp_monthly <- summarise(group_by(tmp, Year, Month,DESCRIPTION),
                            Sum_Annual = sum(Value), 
                            Mean_Annual = mean(Value), 
                            CountDays=n())

   # RETURN NAMED LIST OF BOTH AGGREGATIONS
   return(list(annual=tmp_annual, monthly=tmp_monthly))
}

station_list <- sapply(VCS.Sites$station_names, summarize_stations, simplify=FALSE)


# ACCESS UNDERLYING ELEMENTS
station_list$P205187$annual
station_list$P205187$monthly
...

您甚至可以使用by(object-oriented wrapper to tapply) 子集VCSrawdataby Network_ID(假设它包括所有您需要的站点)。为此,请稍微调整函数以接收数据帧作为允许您跳过子集行的参数。

summarize_stations <- function(tmp_df) { 

  # REMOVE SUBSET LINE
  # tmp_df <- VCSrawdata[VCSrawdata$Network_ID=="P205187",] 
  
  ...keep same code as above    
}

station_list <- by(VCSrawdata, VCSrawdata$Network_ID, FUN=summarize_stations)


# ACCESS UNDERLYING ELEMENTS
station_list$P205187$annual
station_list$P205187$monthly
...

推荐阅读