通过列因子的组合从入射二进制数据获得分类变量的级别的频率(绝对和相对)

时间:2011-09-06 19:08:19

标签: r

我希望分类变量(行向量)的每个级别的频率表示一组93种草本植物的生态类型(3级:H,F,T),用于观察到的物种(= 1)按地点调节(3个等级:A,B,C),栖息地(3个等级:1,2,3,4)和年份(3个等级:1,2,3)。

我知道程序是通过tapply()传递的,但是杂乱的东西来自逻辑运算符,用于连接所有物种的当前物种(= 1)的分类变量(H,F,T)的水平通过列因子的组合进行调节。

这可以通过一个12 x 3列联表来概括,该表列出了每个地点(3)和栖息地(4)的每种生态类型(3)的数量。

我的数据(每个栖息地包含20行):每个物种(Sp1到Sp93)0表示缺席,1表示现在。矢量“类型”包含每个物种的生态类型。

网站,人居,新年,SP1,SP2,SP3,SP4,SP5,SP6,...,SP93

type = c(H,H,F,T,F,T,H,...... T)#长度为93的载体

提前谢谢。


我希望这有助于更好地描述我的数据对象。

  

data = read.csv(file =“Veg_06.csv”,header = TRUE)

     

data = data [1:240,-c(1,4:7)]

Ilot#  因子w / 3级别“A”,“B”,“C”:1 1 1 1 1 1 1 1 1 1 ...每个级别有4个子级别(来自“站点”),每个级别20行,加起来为80按行级划分。

网站#  因子w / 4级别“Am”,“Av”,“CP”,“CS”:2 2 2 2 2 2 2 2 2 2 ...

Sp#  int [1:240] 0 0 0 0 0 0 0 0 0 0 ...缺少或存在物种时为“0”或“1”。

蔬菜#  因子w / 3水平“H”,“F”,“T”:3 3 2 2 3 1 2 1 2 1 ...表示物种类型的分类因子。

2 个答案:

答案 0 :(得分:1)

首先,我会向Hadley Wickham撰写关于Tidy Data的论文推荐http://vita.had.co.nz/papers/tidy-data.pdf,了解如何组织数据以更好地适应分析。实质上,我们将每一行视为一次观察。

听起来基本上,您的数据是yearsitehabitatquadrant(?可能line的集合,不确定描述),species观察点是在该地点,栖息地,象限和年份观察到的物种。为简单起见,如果物种存在,则存在一行。

此外,还有type的概念,它与每个物种有关。

分析和列联表

不考虑如何将数据转换为此表单的问题,我们假设我们拥有上述表单中的数据。

> raw <- expand.grid(species=1:93, quadrant=1:20, habitat=1:4, site=1:3, year=1:3)
> head(raw)
  species quadrant habitat site year
1       1        1       1    1    1
2       2        1       1    1    1
3       3        1       1    1    1
4       4        1       1    1    1
5       5        1       1    1    1
6       6        1       1    1    1

让我们拿一个小样本和一个大样本

> set.seed(100); d.small <- raw[sample(nrow(raw),20), ]
> set.seed(100); d.large <- raw[sample(nrow(raw),1000), ]

我们可以使用ftable函数将其转换为我们想要的状态,12x4列联表,

> ftable(habitat ~ year + site, data=d.small)
          habitat 1 2 3 4
year site
1    1            0 0 1 0
     2            0 0 1 1
     3            0 1 1 1
2    1            2 1 1 0
     2            1 1 0 2
     3            0 0 1 0
3    1            2 0 0 1
     2            0 1 0 1
     3            0 0 0 0

如果它发生在场地/栖息地混合物的两个不同象限中,这将计算两次相同的物种。我们可以丢弃栖息地并unique - ify来计算所有这些栖息地

> ftable(habitat ~ year + site , data=unique(d.small[c('species', 'habitat','year','site')]))

转换(整理源数据)

要将数据转换成这样的形式,这在vanilla R中很棘手。使用tidyr包它会变得更容易(reshape做同样的事情)

> onerow <- data.frame(year=1, site=1, habitat=2, quadrant=3, sp1=0, sp2=1,sp3=0,sp4=0,sp5=1)
> onerow
  year site habitat quadrant sp1 sp2 sp3 sp4 sp5
1    1    1       2        3   0   1   0   0   1

在这里,我假设您的数据看起来像是合理的

> subset(gather(onerow, species, present, -(year:quadrant)), present==1)
  year site habitat quadrant species present
2    1    1       2        3     sp2       1
5    1    1       2        3     sp5       1
> subset(gather(onerow, species, present, -(year:quadrant)), present==1, select=-present)
  year site habitat quadrant species
2    1    1       2        3     sp2
5    1    1       2        3     sp5

现在你可以进行上面的分析了。

合并种类数据

仔细观察你的描述,我想你也希望合并一个物种类型信息的平行向量。

> set.seed(100); sp.type <- data.frame(species=1:93, type=factor(sample(1:4, 93, replace=T)))
> merge(d.small, sp.type)
   species quadrant habitat site year type
1        6       16       4    2    3    2
2       27        9       2    2    2    4
3       27        8       4    2    1    4
4       32       18       1    2    2    4
5       33       18       1    1    2    2
6       45       14       4    2    2    3
7       49        6       2    3    1    1
8       54        3       3    2    1    2
9       55        2       1    1    3    3
10      56        2       4    3    1    2
11      56        1       3    1    1    2
12      57        7       2    1    2    1
13      62       18       4    2    2    3
14      70       19       1    1    2    3
15      77        2       3    3    1    4
16      80        7       3    1    2    1
17      81       17       1    1    3    2
18      82        5       2    2    3    3
19      86        9       4    1    3    3
20      87       10       3    3    2    3

现在,您可以使用上面的subsetuniqueftable方法获取所需的数据。

答案 1 :(得分:0)

假设你有一个数据框(其中包括)名为“sites”,“habitats”,“years”的列:

dfrm <- data.frame( sites = sample( LETTERS[1:3], 20, replace=TRUE),
            habitats= sample( factor(1:4), 20, replace=TRUE),
            years = sample( factor(paste("Y",1:4, sep="_")), 20, replace=TRUE) )

然后,这将为您提供一个额外的因子模式列,用于对每行的各个级别进行编码。

dfrm$three.way.inter <- with(dfrm, interaction(sites, habitats, years))

如果您想要非填充级别,则不执行任何其他操作。如果您想要没有实例的可能级别,请使用drop = TRUE。然后,您可以在三个分类变量的各个级别内分析这些。