首页 文章

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

提问于
浏览
2

我想有一个分类变量(行向量)的每个级别的频率表示一组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 #Factory w / 3 levels“A”,“B”,“C”:1 1 1 1 1 1 1 1 1 1 ...每个级别有4个子级别(来自“Site”),每个级别有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

    首先,我会推荐http://vita.had.co.nz/papers/tidy-data.pdf,Hadley Wickham关于Tidy Data的论文,关于如何组织数据更适合分析的一些想法 . 实质上,我们将每一行视为单一观察 .

    听起来基本上,你的数据是 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
    

    如果它出现在场地/栖息地混合物的两个不同象限中,这将计算相同物种两次 . 我们可以丢弃栖息地并__16520_ -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

    假设你有一个数据框(其中包括)名为“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 . 然后,您可以在三个分类变量的各个级别内分析这些 .

相关问题