Создание нескольких участков с циклом в R - PullRequest
0 голосов
/ 07 февраля 2019

Мои данные доступны здесь и выглядят так:

sq_id        total_forays_day age_at_loc date.x  
  <chr>            <dbl>      <dbl>      <chr>   
22897                1         41        17-06-18
22897                1         42        17-06-19
22897                2         43        17-06-20
22897                2         43        17-06-20
22897                1         44        17-06-21
22897                1         45        17-06-22

Я хотел бы сделать plot(total_forays_day~age_at_loc) для 89 уникальных sq_id, используя цикл.

Я могу получить уникальные графики с помощью sq_id, выполнив следующее:

plot(total_forays_day~age_at_loc, data=(data%>%filter(sq_id=="22641")), type="l")

Но это неэффективный способ сделать это, поскольку мне нужно визуализировать 89 графиков.

Я пытался:

par(mfrow=c(10,10))
for(i in 1:1) { #loop over loop.vector
    plot(total_forays_day~age_at_loc[,i], data=data)
}

Это не работает.Я получаю следующее сообщение об ошибке:

Ошибка в age_at_loc [, i]: неверное количество измерений

Как мне исправить мой код for loop?Мы ценим любые предложения!

1 Ответ

0 голосов
/ 07 февраля 2019

Сначала попробуйте это:

# remove [1:3] when you are comfortable with this and want to see all of them
for (d in split(data, data$sq_id)[1:3]) {
  plot(total_forays_day ~ age_at_loc, data=d)
  readline("next") # or locator(1)
}

Проблемы, с которыми вы столкнулись:

  • total_forays_day~age_at_loc[,i] обрабатывает age_at_loc как рамку, но это вектор
  • total_forays_day~age_at_loc[i] (как я неверно предложил) сравнивает вектор с одним числом, что не работает, поскольку plot ожидает, что все векторы имеют одинаковую длину (age_at_loc[i] равно длине 1)

Ваша проблема в том, что вы не разделяете данные эффективным образом.Если вы посмотрите на результаты из split(...), вы увидите что-то вроде

str(split(data, data$sq_id)[1:3])
# List of 3
#  $ 22640:'data.frame':    102 obs. of  4 variables:
#   ..$ sq_id           : int [1:102] 22640 22640 22640 22640 22640 22640 22640 22640 22640 22640 ...
#   ..$ total_forays_day: int [1:102] 1 1 1 1 1 1 1 1 1 1 ...
#   ..$ age_at_loc      : int [1:102] 49 49 51 51 52 52 53 53 54 54 ...
#   ..$ date.x          : Factor w/ 124 levels "17-06-07","17-06-08",..: 2 2 3 3 4 4 5 5 6 6 ...
#  $ 22641:'data.frame':    52 obs. of  4 variables:
#   ..$ sq_id           : int [1:52] 22641 22641 22641 22641 22641 22641 22641 22641 22641 22641 ...
#   ..$ total_forays_day: int [1:52] 1 1 1 1 1 1 1 1 2 2 ...
#   ..$ age_at_loc      : int [1:52] 49 51 52 53 54 55 59 60 61 61 ...
#   ..$ date.x          : Factor w/ 124 levels "17-06-07","17-06-08",..: 2 3 4 5 6 7 8 9 10 10 ...
#  $ 22653:'data.frame':    35 obs. of  4 variables:
#   ..$ sq_id           : int [1:35] 22653 22653 22653 22653 22653 22653 22653 22653 22653 22653 ...
#   ..$ total_forays_day: int [1:35] 2 2 2 2 1 2 2 1 2 2 ...
#   ..$ age_at_loc      : int [1:35] 58 58 59 59 60 61 61 62 63 63 ...
#   ..$ date.x          : Factor w/ 124 levels "17-06-07","17-06-08",..: 10 10 11 11 12 13 13 14 15 15 ...

Обратите внимание, что каждый элемент списка имеет идентичный sq_id в своем фрейме.Таким образом, split(...)[[1]] - это кадр с 102 строками, каждый из которых sq_id из "22640".Итерируя это с for (d in split(data, data$id)), каждому проходу в цикле присваивается d с одним из этих * sq_id кадров.

Использование readlines("next") против locator(1) является чисто субъективным иПользовательский опыт.Если вы предпочитаете нажать Enter, выберите первое;если вы предпочитаете щелкнуть изображение, выберите второе.

Знайте, что если вы выполняете другие операции с разделенными данными, может быть выгодно разделить один раз и использовать много раз, ala

splitdata <- split(data, data$sq_id)
for (d in splitdata) { ... }
...