【发布时间】:2017-01-24 20:25:05
【问题描述】:
编辑:使用的包是: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: Ryan Morton 建议使用以下代码:
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, etc),这表明发生了错误绑定列表的过程。
关于为什么这可能不起作用的任何想法,以及对列表中找到的频率求和可能有什么解决方案?
非常感谢。
【问题讨论】:
-
我不明白您提供的样本数据如何产生您提到的频率。请详细说明或提供匹配的数据/输出。此外,
count不是基本 R 函数。如果您正在使用任何软件包,请明确提及它们或添加它们的标签。 -
我会 rbind() 数据帧列表,然后对频率求和。使用 dplyr 的 group_by 函数应该可以工作: df %>% group by(x) %>% summarise(freq = sum(freq)。如果需要通过样本名称,则需要将样本名称添加到每个数据帧(并将该变量添加到 group_by 函数)。
-
@lmo 对此感到抱歉-我所做的编辑是否使其更清晰?
-
@RyanMorton 非常感谢您。看起来它应该正是我正在寻找的东西。我明天试试,看看有没有效果。
-
@RyanMorton 代码对我来说没有用(请参阅上面的编辑)。知道为什么会这样吗?我想知道 NA 是否会影响命令...
标签: r list dataframe frequency vegan