2017-02-14 13 views
0

У меня есть dataframe (DF) следующим образом:Расчет индексов разнообразия через сайты в R

Year PlotNo HabitatType Sp1 Sp2 Sp3 Sp4 
2000 1  GH  0 1 2 3 
1988 3  KL  2 3 4 5 

где Sp стенды для видов и ее столбцы представляют ценность изобилие.

Я пытаюсь найти разнообразие Симпсона для каждой строки в dataframe. Я попытался следующий цикл:

require(vegan) 
y <- for(i in 1:nrow(df)) { 
row <- df[i,4:50] #Assuming 50 columns 
diversity(row, "simp") 
} 

Однако я продолжаю нарваться ошибки следующим образом:

Ошибки в сумме (х): неверный «типа» (символ) аргумент

Любые идеи относительно того, как исправить эту ошибку? Или какой-нибудь альтернативный способ обойти это?

+0

как примечание стороны: не называйте data.frame 'df'. Это имя функции в R и приведет к запутыванию сообщений об ошибках в случае синтаксической ошибки. – Bernhard

+0

Спасибо за это! – biogeek

+0

И не могли бы вы сделать свой пример воспроизводимым? Без этого мы не можем догадываться, что происходит не так. –

ответ

2

diversity действительно нуждается в числовых данных, и это может быть вашей проблемой. Что вы получаете от sum(df[,4:50])?

Другая проблема заключается в том, что вам не нужен for() цикл: когда данный кадр данных или матрицу, diversity будет вычислять индекс для каждой строки (или столбца, если вы установите аргумент MARGIN = 2). Поэтому diversity(df[,4:50]) должен делать это при условии, что ваши данные являются числовыми.

+0

Ага, я этого не осознавал. Я подумал, что мне придется перебирать разнообразие в каждой строке, чтобы получить результат. Это решило! – biogeek

0

diversity функция может иметь дело только с числовыми данными. Вероятно, df[i,4:50] содержат нечисловые элементы. Я предполагаю, что некоторые из столбцов: character или factor. Однако без воспроизводимого примера я не могу подтвердить, что это так.

+0

Я проверил это, используя str (df). Год и plot_id - int, plot_type - это фактор, а остальные столбцы - num, как и должно быть. Когда я делаю сводку (df), все столбцы из 4:50 имеют среднюю/медианную и т. Д. Кроме того, теперь я смотрел только между 4: 7, а вывод говорит NULL – biogeek

+0

. Вывод вашей исходной команды всегда будет «NULL» , так как у вас есть 'y <- for() {}' и 'for()' возвращает 'NULL'. Если вы хотите собрать результат в цикле, вы должны выполнить назначение в цикле: 'y <- numeric (nrow (df)); для (i в 1: nrow (df)) {...; y [i] <- разнообразие (строка, "simp")} '. Однако с «разнообразием» вам не нужно 'for()'. –

0

Мы можем использовать:

library(data.table) 
mydf <- setDF(mydf) 
res <- mydf[, div := diversity(mydf[, 4:7], 'simp')] 

Это добавить Колум div с результатом diversity функции для каждой строки.

 Смежные вопросы

  • Нет связанных вопросов^_^