建议所需的汇总R函数

时间:2019-02-12 17:28:16

标签: r aggregate

我有这个数据矩阵:

“ datos”

    n.rock species  altitude site
    R1     sp1      2000    s1
    R1     sp2      2000    s1
    R1     sp3      2000    s1
    R2     sp1      1000    s2
    R2     sp2      1000    s2
    R3     sp1      2700    s3
    R4     sp1      1800    s4
    R4     sp2      1800    s4
    R4     sp3      1800    s4

我想计算每个岩石的种类数,所以我使用:

nro_sp <- aggregate(datos[,2], by=list(datos[,1]), FUN=length)

我得到:

nro_sp
        n.rock  x
        R1      3
        R2      2
        R3      1
        R4      3

我得到了每个岩石的物种数量,这正是我想要的,问题是我失去了我需要的其他变量。

我需要:

    n.rock  x  altitude site      
    R1      3  2000     s1
    R2      2  1000     s2
    R3      1  2700     s3
    R4      3  1800     s4

我尝试使用cbind,但是我的表具有不同的行数,因此行不通。

2 个答案:

答案 0 :(得分:3)

足够吗?

aggregate(species ~ ., data = datos, FUN = length)

您松开物种名称并获得“长度”。

或data.table解决方案:

library(data.table)
setDT(datos)
datos[  , .(n_species = length(species)), by = .(n.rock, site, altitude)]
  n.rock altitude site species
1     R1     2000   s1       3
2     R2     1000   s2       2
3     R3     2700   s3       1
4     R4     1800   s4       3

答案 1 :(得分:3)

似乎n.rockaltitudesite都是一对一的。

我喜欢对软件包dplyr进行此操作。其中没有species,因为没有可以与n.rock组合在一起的唯一值。

library(dplyr)

datos %>%
  group_by(n.rock, altitude, site) %>%
  summarise(count.species = n_distinct(species))

 n.rock altitude site  count.species
  <chr>     <dbl> <chr>         <int>
1 R1         2000 s1                3
2 R2         1000 s2                2
3 R3         2700 s3                1
4 R4         1800 s4                3