Сначала попробуйте это:
# 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) { ... }