2016-12-03 5 views
-1

У меня есть 30 наборов данных, которые все одинаковы, только для разных компаний. Я хочу сделать некоторые основные задачи для всех из них, и довольно сложно повторять каждую команду в течение 30 раз. Я думал, что было бы неплохо создать для циклов. Однако, как я обнаружил, цикл не может работать с символьными переменными. Я попытался сделать что-нибудь в Google или переписать цикл как можно больше, но это не принесло удовлетворительного результата.Как создать цикл для нескольких наборов данных

Я покажу пример функции корреляции.

companies<-c("a", "b", "c") 
for(i in companies){ 
    correlations=cor(x = [i][4], y = [i][5],use="pairwise.complete.obs", method = "pearson") 
} 

Это должно создать вектор корреляций двух разных переменных. Я попытался использовать дополнительную строку кода как:

for(i in companies){ 
    e=paste(i) 
    correlations=cor(x = e[4], y = e[5],use="pairwise.complete.obs", method = "pearson") 
} 

Однако ничего, что я пробовал, не помогло. Есть ли трюк или функция, что может помочь? Благодарим вас за помощь и идеи.

ответ

2

Есть несколько ошибок здесь:

1. Давайте начнем с общей for -loop структуры:

companies<-c("a", "b", "c") 
for(i in c){ 

Что должно c быть здесь? c не определен, поэтому R интерпретирует c как функцию c (см. ?c), который, я уверен, вы не имеете в виду.

Так цикл всегда нужно что-то перебрать: список, вектор ... Я предполагаю, что вы имеете в виду

companies<-c("a", "b", "c") 
for(i in companies){ 

2. Как решить данные/компаний:

Вы пытаетесь получить данные по [i]. Это не имеет значения для R. Обычно [ используется для подмножества, как вы правильно используете, используя [4] для обращения к четвертой колонке. Я предполагаю, что вы хотите получить глобальную переменную с именем «a», «b» или «c», как вы определили в companies. Для этого используйте get(i).

Так если у вас есть 3 переменные в вашей глобальной окружающей среды (то есть, если вы наберете a данные распечатана ...), вы можете сделать это:

companies<-c("a", "b", "c") 
for(i in companies){ 
    cor(x = get(i)[4], y = get(i)[5],use="pairwise.complete.obs", method = "pearson") 
} 

Чтобы напечатать все из них один на один ,

3. Как сохранить результат по вектору? , как вы делаете это

for(i in companies){ 
    correlations = ... 
} 

В каждой итерации цикла correlations получает присваивается новое значение. Таким образом, вы заканчиваете correlations, являясь корреляцией последней компании.

Чтобы сохранить результаты, которые вы могли бы сделать что-то вроде этого:

Теперь correlations именованный вектор со всеми корреляциями.

>>> Как это улучшить?

Если вы хотите выполнить одну и ту же операцию с несколькими объектами одинаковой структуры (например, вашими компаниями), рекомендуется сохранить эти объекты в списке, а затем работать с объектами списка. Это может быть сделано путем:

dat <- mget(companies) 
my_cor <- function(x){ 
    cor(x = x[4], y = x[5], use="pairwise.complete.obs", method = "pearson") 
} 
sapply(dat, my_cor) # gives you the list of your correlations 

>>> Как улучшить этот:

Используйте dplyr пакет следующим образом:

require(dplyr) 
dat <- mget(companies) 
dat <- bind_rows(dat, .id="company") 

Теперь dat это один большой data.frame содержащий информацию обо всех ваших компаниях. Дат%>% group_by (компания)%>% реферирования (корреляции = кор (VARIABLE_NAME_1, VARIABLE_NAME_2, используйте = "pairwise.complete.obs", метод = "Pearson")

для получения дополнительной информации смотрите здесь dplyr -Пакет: https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html

PS:.

Альтернатива dplyr является data.table Лично я нахожу dplyr и tidyverse проще в использовании для большинства задач

..

P.P.S .: Excelent говорить об управлении несколькими моделями, используя tidyverse: https://www.youtube.com/watch?v=rz3_FDVt9eg

+0

К 1 .: Я понял, что, когда я снова прочитал вопрос, но спасибо за указание на это. To 2 .: Большое спасибо, это именно то, что мне было нужно, я не знал, что есть такая функция, которая работает для моего situtation. – Wister

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