2013-02-26 2 views
0

Я довольно новичок в R и задаю пару вопросов о цикле, который я выполняю для выполнения. Я постараюсь объяснить себя как можно лучше, чтобы я не хотел, чтобы я делал это.Выполнение цикла в R

for(i in (1988:1999,2000:2006)){ 
    yearerrors=NULL 
    binding=do.call("rbind.fill",x[grep(names(x), pattern ="1988.* 4._ data=")]) 
    cmeans=lapply(binding[,2:ncol(binding)],mean) 
    datcmeans=as.data.frame(cmeans) 
    finvec=datcmeans[1,] 
    kk=0 
    result=RMSE2(yields[(kk+1):(kk+ncol(binding))],finvec) 
    kk=kk+ncol(binding) 
    yearerrors=c(result) 
} 

yearerrors 
  1. Сначала я желаю цикл для перебора имен файлов данных. В частности, за 1988-2006 годы в том месте, где 1988 год находится , размещенном прямо сейчас в обязательном заявлении. x - список файлов данных , введенный в R, а 1988 - часть имени файла. Итак, у меня есть имена файлов, начинающиеся с 1988, 1989, ..., 2006.

  2. выходы - это числовой вектор, и я хотел бы ввести индексы вектор в функцию RMSE2, как указано в цикле. Для примера , по первой итерации, я хочу, чтобы индексы 1 были в числе числа столбцов в привязке, которые будут использоваться. Затем для следующей итерации Я хочу, чтобы первый индекс был на 1 больше, чем предыдущая итерация закончилась и продолжалась до номера, равного числу столбцов в следующем сообщении . Я просто не знаю, выполнит ли то, что я написал, .

  3. И наконец, я хочу сохранить каждый из этих результатов в векторе yearerrors, а затем получить к нему доступ после этого.

Большое спасибо!

+1

Вы можете сохранить много работы, поместив ваши данные в их собственную папку и установив рабочий каталог там, а затем зациклив на 'for (i в list.files()) {}' ... просто мысль на части 1 – Seth

+1

Привет, вы можете взглянуть на '? As.character' и' paste0'. Кроме того, если вы хотите объединить два отдельных диапазона, обязательно используйте 'c()', как в 'c (1800: 1850, 2003: 212)' –

+0

'(1988: 1999, 2000: 2006)' недействительно, он должен быть 'c (1988: 1999, 2000: 2006)' – Chase

ответ

1

ОК, здесь есть много догадок, потому что структура ваших данных крайне неясна, я понятия не имею, что такое функция RMSE2 (и вы не указали никаких подробностей). Основываясь на вашем вопросе на днях, я собираюсь предположить, что ваши данные находятся в CSV-файлах. У меня будет удар по вашей проблеме.

Я бы начал с создания комбинированного кадра данных при чтении файлов, а не в одном, а затем в другом. Например:

#Set your working directory to the folder containing the .csv files 
#I'm assuming they're all in the form "YEAR.something.csv" based on your pattern matching 

filenames <- list.files(".", pattern="*.csv") #if you only want to match a specific year then add it to the pattern match 
years <- gsub("([0-9]+).*", "\\1", filenames) 

df <- mdply(filenames, read.csv) 
df$year <- as.numeric(years[df$X1]) #Adds the year 
#Your column mean dataframe didn't work for me 
cmeans <- as.data.frame(t(colMeans(df[,2:ncol(df)]))) 

После этого становится трудно понять, чего вы пытаетесь достичь. Так как ваш datcmeans является одной строкой data.frame, datcmeans[1,] ничего не меняет. Поэтому, если одна строка из dataframe (или числового вектора) является аргументом, необходимым для вашей функции RMSE2, вы можете просто передать ее datcmeans (cmeans в моем примере).

Ваш код оттуда в значительной степени не поддается проверке. Не знаю, как выглядит yields, или как работает RMSE2, в значительной степени невозможно помочь больше.

Если вы собираетесь сделать цикл здесь, я скажу, что установка kk=kk+ncol(binding) в конце первой итерации вам не поможет, так как вы установили kk=0, kk не будет равным до ncol(binding), который, я предполагаю, не то, что вы хотите. Вот моя догадка о том, что вам нужно здесь (при условии, что требуется цикл).

yearerrors=vector("numeric", ncol(df)) #Create empty vector ahead of loop 

for(i in 1:ncol(df)) { 
    yearerrors[i] <- RMSE2(yields[i:ncol(df)], finvec) 
} 
yearerrors 

Я, честно говоря, не могу представить функцию, которая будет работать так, но она кажется наиболее логичной адаптацией вашего кода.

+0

Благодарим за терпение и постараемся ответить за меня. В конце концов я закончил тем, что мне нужно с помощью paste0. Извините за объяснение, так как я сказал, что я новичок в R и, может быть, не могу объяснить, как именно мне нужно. Еще раз спасибо. – user1836894

Смежные вопросы