Разреженность, матрица сообщества и петли
Я новый пользователь R, поэтому заранее прошу прощения за свое невежество. У меня есть матрица сообщества потоковых данных о макробеспозвоночных (графики в виде заголовков строк и видов в качестве заголовков столбцов). Я хотел бы сократить данные до 500 человек на участок, сделать это 1000 раз, а затем рассчитать показатель здоровья потока (например, % EPT). На данный момент у меня не было успеха в создании цикла для разрежения данных 1000 раз (или даже 10 раз). Я использую упрощенный набор данных (6 видов, 12 графиков), чтобы выяснить правильный код, поскольку в моей матрице сообщества> 100 видов. Я использую этот сайт (http://ichthyology.usm.edu/courses/multivariate/diversity.R) в качестве шаблона для разработки правильного кода. Заранее спасибо за любую помощь с этим кодом.
Моя матрица с 6 видами, 12 участков
comm
X Attenella.margarita Baetidae Baetis.sp. Baetis.tricaudatus Caenis.sp. Diphetor.hageni
1 1 0 0 0 0 0 36
2 2 0 0 0 1009 0 682
3 3 51 51 0 609 0 406
4 4 0 0 40 0 0 0
5 5 0 0 68 0 68 203
6 6 0 0 0 1244 0 0
7 7 0 0 2090 0 0 0
8 8 0 0 11 0 0 0
9 9 0 0 0 4621 0 0
10 10 0 0 0 1515 0 0
11 11 0 0 0 33 0 0
12 12 0 0 0 116 0 0
Я могу rarefy
этот набор данных 1x с использованием пакета Vegan, но я хотел бы сделать это неоднократно
rrarefy(comm, sample=5)
X Attenella.margarita Baetidae Baetis.sp. Baetis.tricaudatus Caenis.sp. Diphetor.hageni
[1,] 0 0 0 0 0 0 5
[2,] 0 0 0 0 4 0 1
[3,] 0 2 0 0 2 0 1
[4,] 0 0 0 5 0 0 0
[5,] 0 0 0 1 0 1 3
[6,] 0 0 0 0 5 0 0
[7,] 0 0 0 5 0 0 0
[8,] 3 0 0 2 0 0 0
[9,] 0 0 0 0 5 0 0
[10,] 0 0 0 0 5 0 0
[11,] 0 0 0 0 5 0 0
[12,] 0 0 0 0 5 0 0
но мне не повезло при попытке сделать это как цикл 10 раз
> ComLoop = 0
> for (i in 1:10) ComLoop[i] = rrarefy(comm, sample=5)
Warning in ComLoop[i] = rrarefy(comm, sample = 5) :
3 ответа
Решит ли что-то подобное вашу проблему?
res <- lapply(as.list(1:10), function(x) rrarefy(comm, sample=5))
Конечно, есть более элегантные решения, но я не совсем понимаю, что делает разрежение, и ваша ссылка не работает для меня.
Проблема в том, что ComLoop
числовой вектор и rrarefy()
возвращает фрейм данных с данными сообщества. Итак, вы пытаетесь вставить весь фрейм данных в один элемент числового вектора. Это не сработает.
Ответ @ tophcito будет работать, потому что он возвращает список, компоненты которого являются результатом пяти отдельных вызовов rrarefy()
,
Версию цикла можно сделать следующим образом:
require(vegan)
data(dune)
ComLoop <- vector(mode = "list", length = 5)
for (i in seq_along(ComLoop)) {
ComLoop[[i]] <- rrarefy(dune, sample = 5)
}
Который дает
> str(ComLoop)
List of 5
$ : num [1:20, 1:30] 0 0 0 0 0 0 0 1 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:20] "2" "13" "4" "16" ...
.. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
$ : num [1:20, 1:30] 0 0 0 0 0 0 0 1 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:20] "2" "13" "4" "16" ...
.. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
$ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:20] "2" "13" "4" "16" ...
.. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
$ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:20] "2" "13" "4" "16" ...
.. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
$ : num [1:20, 1:30] 0 0 0 0 0 0 0 0 0 0 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:20] "2" "13" "4" "16" ...
.. ..$ : chr [1:30] "Belper" "Empnig" "Junbuf" "Junart" ...
Другими словами, список, каждый компонент которого представляет собой фрейм данных, сгенерированный из матрицы случайных сообществ разреженных данных (для sample
заявлено).
Обратите внимание, что при создании ComLoop
список для хранения результатов, я был явно о длине. Вам не нужно явно указывать длину, поскольку увеличение списка - это та область, где вам не нужно предварительно выделять хранилище. Так что вы можете сделать это:
ComLoop <- list()
Но тогда вы не можете использовать seq_along()
идиома, которую я использовал выше. Там вам нужно явно указать значения i
следует взять, как вы делали изначально:
for(i in 1:5)
ComLoop[i] <- rrarefy(dune, sample = 5)
Я думаю, что лучше настроить размер нужного вам цикла, отсюда и мое оригинальное решение.
user1943324, я тоже пытаюсь вычислить, а затем вычислить показатели беспозвоночных, такие как%EPT. Однако я придерживаюсь другого подхода и наткнулся на камни преткновения с ограниченным опытом r-программирования.
Я предполагаю, что вы пытаетесь производить разреженную матрицу много раз, чтобы затем подсчитать количество таксонов EPT в каждом прогоне разрежения и вычислить среднее значение и изменчивость.
Вместо этого мы могли бы изменить существующий код rarfy{vegan}, чтобы учесть определенные пользователем характеристики (например, EPT или нет, функциональная группа кормления или значение допуска) и в дополнение к существующему общему количеству таксонов, усредненному по нескольким прогонам, использовать IF Чем команда типа усреднить богатство таксонов каждого отдельного состояния черты по этим прогонам?
Там не будет необходимости производить несколько выходных матриц.