У меня есть данные в формате tibble, который выглядит следующим образом (с еще 22 строками и еще 7 столбцами):
reprex[1:10,1:7]
# A tibble: 10 x 7
# Groups: Point, Layer [10]
Point Layer Lari_deci Quer_rope Pinu_sylv Betu_pend Sorb_aucu
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 P03 C 21 17 5 1 0
2 P03 U 0 0 0 0 3
3 P06 C 3 28 28 0 0
4 P07 C 0 3 20 1 1
5 P07 U 0 0 0 0 0
6 P08 C 0 16 21 0 0
7 P08 U 0 0 0 0 0
8 P10 C 0 17 44 1 0
9 P10 U 0 50 0 0 0
10 P11 C 0 36 1 0 0
> dput(reprex[1:10,1:7])
structure(list(Point = c("P03", "P03", "P06", "P07", "P07", "P08",
"P08", "P10", "P10", "P11"), Layer = c("C", "U", "C", "C", "U",
"C", "U", "C", "U", "C"), Lari_deci = c("21", "0", "3", "0",
"0", "0", "0", "0", "0", "0"), Quer_rope = c("17", "0", "28",
"3", "0", "16", "0", "17", "50", "36"), Pinu_sylv = c("5", "0",
"28", "20", "0", "21", "0", "44", "0", "1"), Betu_pend = c("1",
"0", "0", "1", "0", "0", "0", "1", "0", "0"), Sorb_aucu = c("0",
"3", "0", "1", "0", "0", "0", "0", "0", "0")), row.names = c(NA,
-10L), groups = structure(list(Point = c("P03", "P03", "P06",
"P07", "P07", "P08", "P08", "P10", "P10", "P11"), Layer = c("C",
"U", "C", "C", "U", "C", "U", "C", "U", "C"), .rows = structure(list(
1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, 10L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
Я хочу рассчитать индекс разнообразия Симпсона для каждого Point
, учитывая два Layer
уровня по отдельности. Поскольку мои первоначальные попытки сделать это не удались, я решил разделить приведенные выше данные на два, по двум уровням C
и U
, а затем удалить столбец Layer
и преобразовать Point
в rownames
.
В результате я получил данные, которые теоретически были только числовыми (во всех остальных столбцах были подсчеты соответствующих видов). Но на практике это не так, и в этом моя проблема. Затем я преобразовал data.frame с помощью as.matrix
, но все равно получаю следующую ошибку: Error in diversity(., index = "simpson") : input data must be numeric
reprex_C <- reprex %>% filter(Layer == "C") %>% ungroup %>% select(-2) %>%
column_to_rownames(var="Point") %>% as.matrix %>%
diversity(index = "simpson")
# I would have a similar 'reprex_U' object for Layer == "U".
Я попытался найти способы исправить это, каким-то образом преобразовав значения столбцов из символьных в числовые:
as.numeric(reprex_C[,1:14])
но при этом теряются номера строк и, следовательно, идентичность Point. И хотя diversity()
теперь работает, он рассматривает все значения как одно и вычисляет только один индекс разнообразия для всех данных (в отличие от одного значения для каждой строки в моем исходном формате данных).
- Почему
diversity()
не работает с такими данными? Что я могу сделать? - Есть ли способ выполнить
diversity()
без разделения исходных данных с двумяLayer
уровнями на две отдельные матрицы?