计算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", ]

AB
prop.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