построение 5 лучших значений из таблицы в R - PullRequest
6 голосов
/ 07 сентября 2011

Я очень плохо знаком с R, так что это может быть простой вопрос. У меня есть таблица данных, которая содержит подсчет частоты видов, как это:

  Acidobacteria              47
  Actinobacteria            497
  Apicomplexa                 7
  Aquificae                  16
  Arthropoda                 26
  Ascomycota                101
  Bacillariophyta             1
  Bacteroidetes           50279
  ...

В таблице около 50 видов. Как видите, некоторые значения намного больше, чем другие. Я хотел бы иметь составной барплот с топ-5 видов по процентам и одну категорию «другой», которая имеет сумму всех других процентов. Таким образом, мой барплот будет иметь всего 6 категорий (топ-5 и другие).

У меня есть 3 дополнительных набора данных (примеры сайтов), которые я хотел бы сделать так же, чтобы выделить только первые 5 наборов данных в каждом из этих наборов данных и поместить их все на один график. На последнем графике будет 4 столбца с накоплением, показывающих, как верхние виды в первом наборе данных изменяются в каждом дополнительном наборе данных.

Я сделал примерный график вручную (табулировал данные за пределами R и только что подал в итоговую таблицу процентов), чтобы дать вам представление о том, что я ищу:

Я хотел бы поместить эти шаги в сценарий R, чтобы я мог создавать эти графики для многих наборов данных.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 07 сентября 2011

Допустим, ваши данные находятся в data.frame DF

DF <- read.table(textConnection(
"Acidobacteria              47
Actinobacteria            497
Apicomplexa                 7
Aquificae                  16
Arthropoda                 26
Ascomycota                101
Bacillariophyta             1
Bacteroidetes           50279"), stringsAsFactors=FALSE)
names(DF) <- c("Species","Count")

Затем вы можете определить, какие виды входят в топ-5, по

top5Species <- DF[rev(order(DF$Count)),"Species"][1:5]

Каждый из наборов данныхзатем может быть преобразовано в эти 5 и «Другое» с помощью

DF$Group <- ifelse(DF$Species %in% top5Species, DF$Species, "Other")
DF$Group <- factor(DF$Group, levels=c(top5Species, "Other"))
DF.summary <- ddply(DF, .(Group), summarise, total=sum(Count))
DF.summary$prop <- DF.summary$total / sum(DF.summary$total)

Если сделать Group фактором, то все они останутся в том же порядке в DF.summary (от наибольшего к наименьшему в первом наборе данных).

Затем вы просто соединяете их и наносите их на карту, как в своем примере.

1 голос
/ 29 ноября 2013

Мы должны по привычке использовать data.table везде, где это возможно:

library(data.table)
DT<-data.table(DF,key="Count")
DT[order(-rank(Count), Species)[6:nrow(DT)],Species:="Other"]
DT<-DT[, list(Count=sum(Count),Pcnt=sum(Count)/DT[,sum(Count)]),by="Species"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...