计算r中数据帧内变量的相对频率

时间:2014-01-14 01:11:16

标签: r dataframe plyr

我有H.U.G.E.数据集。每行将包含一个门名称,一个度量(M8)和一个文件名。有10个独特的细菌名称和170个独特的文件(名称)。

目标是计算每个文件的每个门的相对丰度和平均值M8。 我知道我可以找到M8的平均值......但是我无法弄清楚如何同时计算相对丰度。需要明确的是,要找到文件x中 Actinobacteria 的相对丰度,

Z = number of times there is an entry for file x in the dataset
K = number of times there is an entry for *Actinobacteria* associated with file x

Relative abundance = K/Z.

我通过随机选择20行来创建小数据集。

Phylum M8 Filename
Crenarchaeota 60.53 4440041.3
Proteobacteria 44.34 4440059.3
Proteobacteria 58.59 4440319.3
Firmicutes 21.49 4440368.3
Proteobacteria 50.96 4440419.3
Firmicutes 37.27 4447102.3
Actinobacteria 70.11 4461011.3
Actinobacteria 64.11 4461140.3
Actinobacteria 54.33 4461152.3
Actinobacteria 68.06 4461158.3
Firmicutes 58.95 4461168.3
Firmicutes 38.81 4461186.3
Proteobacteria 58.0 4461199.3
Actinobacteria 58.73 4461210.3
Firmicutes 44.59 4461211.3
Euryarchaeota 45.56 4461229.3
Euryarchaeota 58.0 4477874.3
Proteobacteria 62.0 4477874.3
Proteobacteria 57.0 4477874.3
Proteobacteria 56.0 4477874.3

我通过文件名找到M8的平均值

library('plyr')
myDF = read.csv(fileName, header = TRUE, sep = ' ')
myDF$Filename <- as.character(myDF$Filename)

myDF.mean = ddply(myDF, .(Filename), summarize, meanM8= mean(M8, na.rm=TRUE))
print(myDF.mean)

           Phylum  Filename   meanM8
1  Actinobacteria 4461011.3 70.11000
2  Actinobacteria 4461140.3 64.11000
3  Actinobacteria 4461152.3 54.33000
4  Actinobacteria 4461158.3 68.06000
5  Actinobacteria 4461210.3 58.73000
6   Crenarchaeota 4440041.3 60.53000
7   Euryarchaeota 4461229.3 45.56000
8   Euryarchaeota 4477874.3 58.00000
9      Firmicutes 4440368.3 21.49000
10     Firmicutes 4447102.3 37.27000
11     Firmicutes 4461168.3 58.95000
12     Firmicutes 4461186.3 38.81000
13     Firmicutes 4461211.3 44.59000
14 Proteobacteria 4440059.3 44.34000
15 Proteobacteria 4440319.3 58.59000
16 Proteobacteria 4440419.3 50.96000
17 Proteobacteria 4461199.3 58.00000
18 Proteobacteria 4477874.3 58.33333

一切看起来都不错......(这个练习对于这个数据集来说是微不足道的,除了文件4477874.3的Proteobacteria之外 - 它有3个条目(4477874.3有4个条目))。

myDF.RA= ddply(myDF, .(Phylum, Filename), summarize, meanM8=mean(m8), RA = sum(length(Phylum))/sum(length(Filename)))
print(myDF.RA)


          Phylum  Filename   meanM8 RA
1  Actinobacteria 4461011.3 70.11000  1
2  Actinobacteria 4461140.3 64.11000  1
3  Actinobacteria 4461152.3 54.33000  1
4  Actinobacteria 4461158.3 68.06000  1
5  Actinobacteria 4461210.3 58.73000  1
6   Crenarchaeota 4440041.3 60.53000  1
7   Euryarchaeota 4461229.3 45.56000  1
8   Euryarchaeota 4477874.3 58.00000  1
9      Firmicutes 4440368.3 21.49000  1
10     Firmicutes 4447102.3 37.27000  1
11     Firmicutes 4461168.3 58.95000  1
12     Firmicutes 4461186.3 38.81000  1
13     Firmicutes 4461211.3 44.59000  1
14 Proteobacteria 4440059.3 44.34000  1
15 Proteobacteria 4440319.3 58.59000  1
16 Proteobacteria 4440419.3 50.96000  1
17 Proteobacteria 4461199.3 58.00000  1
18 Proteobacteria 4477874.3 58.33333  1

对于与文件4477874.3相关的Proteobacteria,RA应为3/4 = .75

如何正确计算相对丰度?谢谢。

2 个答案:

答案 0 :(得分:2)

我认为您无法一步完成此操作,因为您需要每个文件的总条目数来计算相对丰度。分两步:

library(plyr)
df.file.count <- ddply(df, .(Filename), summarize, file.count=length(Filename))
df.phyl.file <- ddply(df, .(Filename, Phylum), summarize, meanM8=mean(M8), f.ph.count=length(Phylum))
transform(merge(df.file.count, df.phyl.file), RA=f.ph.count/file.count)[c(1, 3, 4, 6)]

# Filename         Phylum   meanM8   RA
# 1   4440041  Crenarchaeota 60.53000 1.00
# 2   4440059 Proteobacteria 44.34000 1.00
# 3   4440319 Proteobacteria 58.59000 1.00
# 4   4440368     Firmicutes 21.49000 1.00
# 5   4440419 Proteobacteria 50.96000 1.00
# 6   4447102     Firmicutes 37.27000 1.00
# 7   4461011 Actinobacteria 70.11000 1.00
# 8   4461140 Actinobacteria 64.11000 1.00
# 9   4461152 Actinobacteria 54.33000 1.00
# 10  4461158 Actinobacteria 68.06000 1.00
# 11  4461168     Firmicutes 58.95000 1.00
# 12  4461186     Firmicutes 38.81000 1.00
# 13  4461199 Proteobacteria 58.00000 1.00
# 14  4461210 Actinobacteria 58.73000 1.00
# 15  4461211     Firmicutes 44.59000 1.00
# 16  4461229  Euryarchaeota 45.56000 1.00
# 17  4477874  Euryarchaeota 58.00000 0.25
# 18  4477874 Proteobacteria 58.33333 0.75

注意我会得到不同的指标。也许我错过了解你的RA计算。对于文件4477874(我丢失了.3s,但它们都在那里似乎并不重要),数据集中总共有4个条目(3个用于Proteo,1个用于Euryar ...),所以对于4477874-Proteo,我计算RA为3/4。这是错的吗?

至于方法学,先获取文件计数,然后获取文件/细菌计数,然后将两者合并在一起计算细菌数/文件数。

答案 1 :(得分:2)

遵循Broadie的方法,这是一个data.table解决方案,我相信它可以用更少的步骤完成。请随时编辑。

require(data.table)
DT <- data.table(df)
DT[, Filename := as.factor(Filename)]

setkey(DT, Filename)
CountF <- DT[J(levels(Filename)), .N]
setkey(DT, Filename, Phylum)

DT_CJ <- DT[CJ(unique(Filename), unique(Phylum)), .N][N > 0]

setkey(DT_CJ, Filename)
JN <- DT_CJ[J(CountF)]
JN[, RA := N/N.1]

M8 <- DT[, list(meanM8 = mean(M8)), by="Filename,Phylum"]
setkey(JN, Filename, Phylum)
TBL <- JN[J(M8)]

tail(TBL)

#    Filename         Phylum N N.1   RA   meanM8
# 1: 4461199.3 Proteobacteria 1   1 1.00 58.00000
# 2: 4461210.3 Actinobacteria 1   1 1.00 58.73000
# 3: 4461211.3     Firmicutes 1   1 1.00 44.59000
# 4: 4461229.3  Euryarchaeota 1   1 1.00 45.56000
# 5: 4477874.3  Euryarchaeota 1   4 0.25 58.00000
# 6: 4477874.3 Proteobacteria 3   4 0.75 58.33333