我有这个数据矩阵:
“ 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,但是我的表具有不同的行数,因此行不通。
答案 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.rock
,altitude
和site
都是一对一的。
我喜欢对软件包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