Цикл foreach / forvalues ​​в R

Я довольно хорошо разбираюсь в циклах в 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, но я не могу понять это. Пожалуйста помоги.

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]]) 
  }
}

Если я правильно понял после комментариев, я думаю, что вы хотите взять данные из разных листов по нескольким рабочим книгам и назначить данные каждого листа в отдельный отдельный фрейм данных, чтобы у вас было много фреймов данных; и вы не хотите делать это объединение внутри цикла, потому что каждый может быть структурирован по-разному. Если это так, то вы можете изменить свой код следующим образом:

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 создаст из него новую отличную переменную.

Я отмечаю ссылки на year а также i в вашем коде, который я предполагаю, что вы установили заранее, поэтому я не обращаюсь к ним.

Другие вопросы по тегам