【问题标题】:foreach / forvalues loop in RR中的foreach / forvalues循环
【发布时间】:2018-09-21 20:41:30
【问题描述】:

我对 Stata 中的循环非常满意,我正在尝试在 R 中编写类似的东西,但我不断收到错误消息 - 知道为什么这个循环不起作用吗?

我有一个 Excel 表,其中包含每个月带有单独选项卡的数据(如月列表中)。我想导入每个单独的选项卡并向其添加年份和月份列。

monthlist = list("Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", 
"Sep", "Oct", "Nov", "Dec")

for (k in seq_along(monthlist)){
   infile <- paste(i, " GP",".xlsx",sep=""); name<- 
   paste("X",i,"_GP",sep="")
   name.[k]<- read_excel(infile, sheet = [k])
   month=[k]
   name.[k] = cbind(year, month, name.[k])
  }

我已经尝试并尝试研究对 k 值的正确引用,但我无法弄清楚。请帮忙。

【问题讨论】:

  • 你从哪里得到的年份?我没有在循环中看到它。
  • 请发布您收到的错误消息。
  • 我只问了子循环不要太笼统,但这是整个循环,包括年份: i=2014 monthlist = list("Jan", "Feb", "Mar", “四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”) while (i
  • Mike S,我在多张纸上看到了那篇导入文章,但它变得有点复杂,因为虽然我的纸上的大多数列都是相同的,但有些不同,我可以重新绑定数据。框架(或者我认为,因为试验给了我多个错误)。所以我到处写自己的循环。我想更普遍的问题是关于单元格引用 - 在我的循环中我写 for (k in seq_along(monthlist)){ } - 但我如何正确地引用循环内的“k”?

标签: r loops ranged-loops


【解决方案1】:

如果我对 cme​​ts 的理解正确,我认为您想从多个工作簿中的不同工作表中获取数据,并将每个工作表的数据分配给自己单独的数据框,这样您就有很多数据框;并且您不想在循环内进行此组合,因为每个结构都可能不同。如果是这种情况,那么您可以将代码修改为:

monthlist = list("Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", 
"Sep", "Oct", "Nov", "Dec")

for (k in seq_along(monthlist)){
   infile = paste(i, " GP",".xlsx",sep="")
   name = paste("X",i,"_GP",sep="")
   d_temp = read_excel(infile, sheet = k)
   assign(paste0(year, month), d_temp)
  }

重点是在读入文件的时候把k两边的方括号去掉,二是用assign()动态创建变量名。 d_temp 在 assign 从中创建新的不同变量之前临时存储数据帧。

我注意到您的代码中对 yeari 的引用我假设您已经预先设置,所以我没有解决这些问题。

【讨论】:

  • 但只导入了每个工作簿中的第一张工作表,并没有创建新列。
【解决方案2】:

如果没有您的数据,很难告诉您这是否可行,但这里有一些选项。如果我不确定所有数据帧的行数是否相同,我会亲自创建数据帧的嵌套数据帧。

library(tidyverse)
library(readxl)

df <- data_frame(year = rep(c(2014, 2015, 2016), each = 12), 
                 month = rep(c("Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", 
                              "Sep", "Oct", "Nov", "Dec"), 3)) %>%
  mutate(infile = map_chr(year, ~paste(.x, " GP",".xlsx",sep="")),
         data = map2(infile, month, ~read_excel(.x, sheet = .y)),
         data = map2(data, month, ~mutate(.x, month = .y)),
         data = map2(data, year, ~mutate(.y, year = .y)))

但是,如果您想使用循环,您也可以这样做,在这种情况下,我会推荐一个数据框列表。

year <- c(2014:2016)
month = c("Jan", "Feb", "Mar", "Apr", "May", "June", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") 
df.list <- list()
for(i in seq_along(year)){
  for (k in seq_along(month)){ 
  infile <- paste(year[[i]], " GP",".xlsx",sep="") 
  name<- paste("X",year[[i]],"_GP",sep="") 
  df.list[[i]] <- read_excel(infile, sheet = month[[k]]) 
  }
}

【讨论】:

    猜你喜欢
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2019-07-13
    • 2016-05-28
    • 2012-03-29
    • 2019-08-25
    相关资源
    最近更新 更多