修改:使用的软件包为: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等),这表明发生了错误绑定列表的过程。
为什么这可能不起作用的任何想法,以及可能有什么解决方案来总结列表中的频率?
非常感谢。
答案 0 :(得分:0)
<强>更新强> 我想出了如何将我的原始频率表加起来并将其转换为我希望的数据框。感谢Ryan Morton指出我正确的方向并提供代码。
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)