Редактировать: Используемые пакеты: 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 и т. д.)), что указывает на то, что в процессе связывания списков произошло что-то неправильное.
Любые идеи, почему это может не работать, и какое решение может быть использовано для суммирования частоты, найденной в списке?
Большое спасибо.
Я не понимаю, как данные образца, которые вы предоставляете, дают частоты, о которых вы упоминаете. Просьба уточнить или предоставить данные/результаты, которые соответствуют. Кроме того, 'count' не является базовой функцией R. Если вы используете какие-либо пакеты, укажите их явно или добавьте их. – lmo
Я бы привязал() список кадров данных, а затем суммировал частоты. Использование функции group_by dplyr должно работать: df%>% group by (x)%>% summary (freq = sum (freq). Если вам нужно, чтобы имя образца прошло, вам нужно добавить имя образца в каждый кадр данных (и добавьте эту переменную в функцию group_by). –
@lmo жаль, что у меня есть изменения, которые я сделал, чтобы сделать их более ясными? –