2017-01-24 3 views
0

Редактировать: Используемые пакеты: plyr и vegan. R - самая современная версия.R: Суммирование частоты в списке

Моя база данных заключается в следующем:

X1 = c('Archea01', 'Bacteria01', 'Bacteria02') 
Sample1 = c(0.2,NA,NA) 
Sample2 = c(0, 0.001, NA) 
Sample3 = c(0.04, NA, NA) 
df = data.frame(X1,Sample1,Sample2,Sample3) 
df 
      X1 Sample1 Sample2 Sample3 
1 Archea01  0.2 0.000 0.04 
2 Bacteria01  NA 0.001  NA 
3 Bacteria02  NA  NA  NA 

Данные целенаправленно сделаны НСБУ, чтобы отразить реальные данные.

Моя цель состоит в том, чтобы подвести частоту бактериального/archeal появления в каждом образце, который бы идеально создать этот тип кадра данных:

Sample1 Sample2 Sample3 
23   11   12 

Я сумел создать список частот:

dfFreq <- apply(df, 2, count) 

Хотя это выглядит хорошо, это не совсем то, что я хочу:

head(dfFreq)[2] 
$Sample2 
     x freq 
1  0.000 23 
2  0.001 5 
3  <NA> 50 

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

df.data <- ldply (dfFreq, data.frame) 
dfSUM <- apply(dfFreq, 2, sum) 

Попытка суммировать список просто не сработала (неудивительно). Что касается преобразования в dataframe, я посмотрел всего переполнение стека и видел много предполагающих выше или lapply, но кадр данных, который создается из кода предложенного является:

x   freq 
Archea01 1 
Bacteria01 1 
etc   etc 

Который не то, что я хочу ,

Любые мысли о том, как либо A) суммировать частоту, а затем преобразовывать в кадр данных, как тот, который я хочу, или B) преобразовать список в разумный кадр данных, чей частотный столбец можно суммировать? Я думаю, что А - это единственный способ, которым я могу добраться до такой степени, какой хочу, но любые мысли об этом были бы весьма признательны.

Edit 2,0: Райан Мортон предложил следующий код:

require(dplyr) 
dfBound <- rbind(dfFreq) 

Что привело к этому кадру данных:

 X1         Sample1 
dfFreq list(x = 1:1885, freq = c(1, 1, 1) list(x = c(1, 2, 3) 

Хотя это, конечно, кажется, ближе к решению, я замечаю, что каждый список либо следует за форматом X1, либо с форматом Sample1 (x = c (1,2,3 и т. д.)), что указывает на то, что в процессе связывания списков произошло что-то неправильное.

Любые идеи, почему это может не работать, и какое решение может быть использовано для суммирования частоты, найденной в списке?

Большое спасибо.

+2

Я не понимаю, как данные образца, которые вы предоставляете, дают частоты, о которых вы упоминаете. Просьба уточнить или предоставить данные/результаты, которые соответствуют. Кроме того, 'count' не является базовой функцией R. Если вы используете какие-либо пакеты, укажите их явно или добавьте их. – lmo

+0

Я бы привязал() список кадров данных, а затем суммировал частоты. Использование функции group_by dplyr должно работать: df%>% group by (x)%>% summary (freq = sum (freq). Если вам нужно, чтобы имя образца прошло, вам нужно добавить имя образца в каждый кадр данных (и добавьте эту переменную в функцию group_by). –

+0

@lmo жаль, что у меня есть изменения, которые я сделал, чтобы сделать их более ясными? –

ответ

0

Обновление Я выяснил, как суммировать исходную частотную таблицу и преобразовать ее в кадр данных, на который я надеялся. Спасибо Райану Мортону за то, что он указал мне в правильном направлении и предоставил код.

dfNARemoved <- lapply(dfFreq, function(x) transform(x[-nrow(x),]))#removing useless NAs in my data 
dfFreqxRemoved <- lapply(dfNARemoved, function(x) { x["x"] <- NULL; x })  #removing useless x column 
dfSum <- lapply(dfFreqxRemoved, function(x) sum(x)) 
require(dplyr) 
#Now converting into a dataframe 
dfBound <- rbind(dfSum) 
dfData <- as.data.frame(dfBound) 
Смежные вопросы