计算R中的频率
我的数据集如下所示:计算R中的频率,r,frequency,R,Frequency,我的数据集如下所示: genera Genus Location Number 1 NA 2 Terriglobus CC 1 3 Terriglobus N 5 4 Acidobacterium CC 2 5 Acidobacterium N 12 6 Edap
genera
Genus Location Number
1 NA
2 Terriglobus CC 1
3 Terriglobus N 5
4 Acidobacterium CC 2
5 Acidobacterium N 12
6 Edaphobacter CC 0
我想做两件事1)删除任何列中带有NA的行,2)计算两个位置中每个属的频率,CC和N
我一直在尝试使用
AB<-genera[genera[, "Location"] == "CC", ] #to keep all separate the rows by location
CD<-genera[genera[, "Location"] == "N", ]
ABprop.table
需要一个table对象作为开始:
prop.table( table(genera$CC) )
如果“Number”是一个计数,那么您可能希望tapply
的总和为Number
。也许是这样的:
prop.table( with(genera, tapply(Number, CC, sum) ) )
xtabs
也将进行求和:
prop.table( xtabs( Number ~ CC, data=genera) )
我必须添加两个空值来创建表
> dat <- read.table(header = TRUE, text = 'Genus Location Number
1 NULL NULL NA
2 Terriglobus CC 1
3 Terriglobus N 5
4 Acidobacterium CC 2
5 Acidobacterium N 12
6 Edaphobacter CC 0', row.names = 1)
对于你的第二个问题,我认为你可能会混淆频率和百分比(或概率)。频率可通过以下方式找到:
> sapply(split(newDat, as.character(newDat$Genus)), function(x){
sum(x$Number)
})
Acidobacterium Edaphobacter Terriglobus
14 0 6
百分比有点不同
> pct <- with(newDat, Number/sum(Number))
> names(pct) <- newDat$Location
已添加
再想一想,你可能只需要
> split(newDat[,c("Location", "Number")], newDat$Genus)
$Acidobacterium
Location Number
4 CC 2
5 N 12
$Edaphobacter
Location Number
6 CC 0
$Terriglobus
Location Number
2 CC 1
3 N 5
下面是我将如何使用@RichardScriven的dat
:
with(na.omit(dat), aggregate(Number, list(Genus=Genus, Location=Location), sum))
# Genus Location x
# 1 Acidobacterium CC 2
# 2 Edaphobacter CC 0
# 3 Terriglobus CC 1
# 4 Acidobacterium N 12
# 5 Terriglobus N 5
编辑
鉴于您在对其他解决方案的评论中所作的澄清,我现在提出以下建议,即针对每个属
和位置
,计算数量
,作为该位置的数量
总和的比例。同样,从@RichardScriven的dat
开始
do.call(rbind, lapply(unique(dat$Location), function(x) {
d <- subset(dat, Location==x)
cbind(Location=x, aggregate(d$Number, list(Genus=d$Genus),
function(x) sum(x)/sum(d$Number)))
}))
# Location Genus x
# 1 CC Acidobacterium 0.6666667
# 2 CC Edaphobacter 0.0000000
# 3 CC Terriglobus 0.3333333
# 4 N Acidobacterium 0.7058824
# 5 N Terriglobus 0.2941176
然后可以使用do.call(rbind,x)
将其组合到单个数据帧中,其中x
是上面创建的列表
最后,您可以使用dplyr
,如下所示:
library(dplyr)
dat %.%
group_by(Location) %.%
mutate(total = sum(Number), Propn = Number/total) %.%
select(-total)
# Genus Location Number Propn
# 1 Terriglobus CC 1 0.3333333
# 2 Terriglobus N 5 0.2941176
# 3 Acidobacterium CC 2 0.6666667
# 4 Acidobacterium N 12 0.7058824
# 5 Edaphobacter CC 0 0.0000000
我建议您查看一下(1)的?na.省略,以及(2)的?聚合。如果两个位置的属长度不同,该怎么办?谢谢,我能够删除所有na行。现在关于第二部分,您建议的代码消除了位置指定,这是计算每个位置中每个属的频率所必需的。对于第一个问题,dat[complete.cases(dat),]
-将在任何列中处理NA。实际上,我不确定我是否理解您想要的频率。我以为你是指两者的总和,按属。@user3018479,你把频率和百分比(或概率)混淆了。频率是简单的事件发生的次数,而你评论中的1/sum(…)
是一个百分比。好吧,随便什么。这不是频率。
do.call(rbind, lapply(unique(dat$Location), function(x) {
d <- subset(dat, Location==x)
cbind(Location=x, aggregate(d$Number, list(Genus=d$Genus),
function(x) sum(x)/sum(d$Number)))
}))
# Location Genus x
# 1 CC Acidobacterium 0.6666667
# 2 CC Edaphobacter 0.0000000
# 3 CC Terriglobus 0.3333333
# 4 N Acidobacterium 0.7058824
# 5 N Terriglobus 0.2941176
lapply(split(dat, list(dat$Location), drop=TRUE), function(x)
transform(x, propn=x$Number/sum(x$Number)))
# $CC
# Genus Location Number propn
# 2 Terriglobus CC 1 0.3333333
# 4 Acidobacterium CC 2 0.6666667
# 6 Edaphobacter CC 0 0.0000000
#
# $N
# Genus Location Number propn
# 3 Terriglobus N 5 0.2941176
# 5 Acidobacterium N 12 0.7058824
library(dplyr)
dat %.%
group_by(Location) %.%
mutate(total = sum(Number), Propn = Number/total) %.%
select(-total)
# Genus Location Number Propn
# 1 Terriglobus CC 1 0.3333333
# 2 Terriglobus N 5 0.2941176
# 3 Acidobacterium CC 2 0.6666667
# 4 Acidobacterium N 12 0.7058824
# 5 Edaphobacter CC 0 0.0000000