我很高兴在Stata中使用循环,并且尝试在R中编写类似的程序,但是我不断收到错误消息-任何想法为何此循环不起作用?
我有一个Excel工作表,其中每个月的数据带有单独的选项卡(如monthlist)。我想导入每个单独的标签,并在其中添加年和月列。
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值的正确引用,但是我无法弄清楚。请帮忙。
答案 0 :(得分:0)
如果我对注释的理解正确,我想您希望从多个工作簿的不同工作表中获取数据,并将每个工作表的数据分配给自己的单独数据框,这样您就可以拥有许多数据框。而且您不想在循环中进行合并,因为每个结构可能不同。如果是这种情况,那么您可以将代码修改为此:
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
临时存储数据框,然后分配为其创建新的不同变量。
我注意到您假设已预先设置了对您代码中的year
和i
的引用,所以我不在此赘述。
答案 1 :(得分:0)
在没有数据的情况下,很难告诉您这是否有效,但是这里有一些选择。如果不确定所有数据框的行数是否相同,我将亲自创建一个数据框的嵌套数据框。
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]])
}
}