Прежде всего, я бы порекомендовал http://vita.had.co.nz/papers/tidy-data.pdf, статью Хэдли Уикхэма о Tidy Data, для некоторых идей о том, как организовать данные, чтобы лучше подходить для анализа. По сути, мы думаем о каждой строке как об одном наблюдении.
Это звучит как фундаментально, ваши данные представляют собой набор year
, site
, habitat
, quadrant
(? Может быть line
, не уверен из описания), species
с точкой наблюдения Существование этого вида наблюдалось в этом месте, среде обитания, квадранте и году. Для простоты есть ряд, если вид присутствует.
Кроме того, существует понятие type
, связанное с каждым видом.
Таблица анализа и непредвиденных расходов
Отложив вопрос о том, как получить ваши данные в этой форме, давайте предположим, что у нас есть данные в форме, описанной выше.
> raw <- expand.grid(species=1:93, quadrant=1:20, habitat=1:4, site=1:3, year=1:3)
> head(raw)
species quadrant habitat site year
1 1 1 1 1 1
2 2 1 1 1 1
3 3 1 1 1 1
4 4 1 1 1 1
5 5 1 1 1 1
6 6 1 1 1 1
А давайте возьмем маленький образец и большой образец
> set.seed(100); d.small <- raw[sample(nrow(raw),20), ]
> set.seed(100); d.large <- raw[sample(nrow(raw),1000), ]
Мы можем использовать функцию ftable
, чтобы перевести это в требуемое состояние, таблицу непредвиденных обстоятельств 12x4, как
> ftable(habitat ~ year + site, data=d.small)
habitat 1 2 3 4
year site
1 1 0 0 1 0
2 0 0 1 1
3 0 1 1 1
2 1 2 1 1 0
2 1 1 0 2
3 0 0 1 0
3 1 2 0 0 1
2 0 1 0 1
3 0 0 0 0
Это будет считать один и тот же вид дважды, если он встречается в двух разных секторах смеси место / среда обитания. Мы можем отказаться от среды обитания и unique
указать, чтобы подсчитать по всем из них
> ftable(habitat ~ year + site , data=unique(d.small[c('species', 'habitat','year','site')]))
Преобразование (приведение в порядок исходных данных)
Преобразовать данные в их виде в такую форму сложно в vanilla R. С пакетом tidyr
это становится проще (reshape
также делает очень похожие вещи)
> onerow <- data.frame(year=1, site=1, habitat=2, quadrant=3, sp1=0, sp2=1,sp3=0,sp4=0,sp5=1)
> onerow
year site habitat quadrant sp1 sp2 sp3 sp4 sp5
1 1 1 2 3 0 1 0 0 1
Здесь я делаю предположения о том, как выглядят ваши данные, которые кажутся разумными
> subset(gather(onerow, species, present, -(year:quadrant)), present==1)
year site habitat quadrant species present
2 1 1 2 3 sp2 1
5 1 1 2 3 sp5 1
> subset(gather(onerow, species, present, -(year:quadrant)), present==1, select=-present)
year site habitat quadrant species
2 1 1 2 3 sp2
5 1 1 2 3 sp5
А теперь вы можете приступить к анализу, приведенному выше.
Объединение данных вида вида
Глядя на ваше описание немного ближе, я думаю, что вы также хотите объединить в параллельном векторе информацию о типовых видах.
> set.seed(100); sp.type <- data.frame(species=1:93, type=factor(sample(1:4, 93, replace=T)))
> merge(d.small, sp.type)
species quadrant habitat site year type
1 6 16 4 2 3 2
2 27 9 2 2 2 4
3 27 8 4 2 1 4
4 32 18 1 2 2 4
5 33 18 1 1 2 2
6 45 14 4 2 2 3
7 49 6 2 3 1 1
8 54 3 3 2 1 2
9 55 2 1 1 3 3
10 56 2 4 3 1 2
11 56 1 3 1 1 2
12 57 7 2 1 2 1
13 62 18 4 2 2 3
14 70 19 1 1 2 3
15 77 2 3 3 1 4
16 80 7 3 1 2 1
17 81 17 1 1 3 2
18 82 5 2 2 3 3
19 86 9 4 1 3 3
20 87 10 3 3 2 3
И теперь вы можете использовать подходы subset
, unique
и ftable
, описанные выше, чтобы получить необходимые данные.