R: Суммарная частота в списке

Изменить: используются следующие пакеты: plyr и vegan. 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

Данные специально сделаны с помощью NA, чтобы отражать реальные данные.

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

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  

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

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

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

 x           freq
 Archea01    1
 Bacteria01  1
 etc         etc

Это не то, чего я хочу.

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

Изменить 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 и т. д.), что указывает на то, что в процессе обработки произошло что-то неправильное. привязка списков.

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

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


person E.O.    schedule 24.01.2017    source источник
comment
Я не понимаю, как предоставленные вами образцы данных дают частоты, которые вы упомянули. Пожалуйста, уточните или предоставьте данные/выходные данные, которые соответствуют. Кроме того, count не является базовой функцией R. Если вы используете какие-либо пакеты, укажите их явно или добавьте их тег.   -  person lmo    schedule 24.01.2017
comment
Я бы rbind() список кадров данных, а затем суммировать частоты. Использование функции group_by dplyr должно работать: df %›% group by(x) %›% summarise(freq = sum(freq). Если вам нужно, чтобы имя образца пришло, вам нужно добавить имя образца в каждый фрейм данных ( и добавьте эту переменную в функцию group_by).   -  person Ryan Morton    schedule 24.01.2017
comment
@lmo извините за это - сделанные мной изменения сделали его более ясным?   -  person E.O.    schedule 25.01.2017
comment
@RyanMorton большое спасибо за это. Похоже, это должно быть именно то, что я ищу. Завтра попробую и посмотрю, получится ли.   -  person E.O.    schedule 25.01.2017
comment
@RyanMorton, код у меня не сработал (см. правки выше). Есть идеи, почему это может быть? Мне интересно, влияют ли NA на команды...   -  person E.O.    schedule 25.01.2017


Ответы (1)


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

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)
person E.O.    schedule 25.01.2017