цикл foreach / forvalues ​​в R - PullRequest
       15

цикл foreach / forvalues ​​в R

0 голосов
/ 21 сентября 2018

У меня все в порядке с циклами в 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 ]

0 голосов
/ 22 сентября 2018

Без ваших данных немного сложно сказать вам, будет ли это работать или нет, но вот несколько вариантов.Я бы лично создал вложенный фрейм данных из фреймов данных, если бы не был уверен, что все фреймы данных имеют одинаковое количество строк.

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]]) 
  }
}
0 голосов
/ 22 сентября 2018

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

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

...