R:按类别计算唯一值

Kla*_*uis 11 r unique count categories

我在R中的数据看起来像这样:

 Cnty   Yr   Plt       Spp  DBH Ht Age
 1  185 1999 20001 Bitternut  8.0 54  47
 2  185 1999 20001 Bitternut  7.2 55  50
 3   31 1999 20001    Pignut  7.4 71  60
 4   31 1999 20001    Pignut 11.4 85 114
 5  189 1999 20001        WO 14.5 80  82
 6  189 1999 20001        WO 12.1 72  79
Run Code Online (Sandbox Code Playgroud)

我想知道每个县(Cnty)的独特物种(Spp)的数量."unique(dfname $ Spp)"给了我数据框中唯一种类的总数,但是我想按县一样.

任何帮助表示赞赏!很抱歉奇怪的格式化,这是我第一个关于SO的问题.

谢谢.

A5C*_*2T1 16

我试图让你的样本数据更有趣.您的样本数据目前每个"Cnty"只有一个唯一的"Spp".

set.seed(1)
mydf <- data.frame(
  Cnty = rep(c("185", "31", "189"), times = c(5, 3, 2)),
  Yr = c(rep(c("1999", "2000"), times = c(3, 2)), 
         "1999", "1999", "2000", "2000", "2000"),
  Plt = "20001",
  Spp = sample(c("Bitternut", "Pignut", "WO"), 10, replace = TRUE),
  DBH = runif(10, 0, 15)
)
mydf
#    Cnty   Yr   Plt       Spp       DBH
# 1   185 1999 20001 Bitternut  3.089619
# 2   185 1999 20001    Pignut  2.648351
# 3   185 1999 20001    Pignut 10.305343
# 4   185 2000 20001        WO  5.761556
# 5   185 2000 20001 Bitternut 11.547621
# 6    31 1999 20001        WO  7.465489
# 7    31 1999 20001        WO 10.764278
# 8    31 2000 20001    Pignut 14.878591
# 9   189 2000 20001    Pignut  5.700528
# 10  189 2000 20001 Bitternut 11.661678
Run Code Online (Sandbox Code Playgroud)

接下来,如所建议的,tapply这里是一个很好的候选人.合并uniquelength获取您要查找的数据.

with(mydf, tapply(Spp, Cnty, FUN = function(x) length(unique(x))))
# 185 189  31 
#   3   2   2 
with(mydf, tapply(Spp, list(Cnty, Yr), FUN = function(x) length(unique(x))))
#     1999 2000
# 185    2    2
# 189   NA    2
# 31     1    1
Run Code Online (Sandbox Code Playgroud)

如果您对简单列表(不是唯一值)感兴趣,那么您可以探索tableftable:

with(mydf, table(Spp, Cnty))
#            Cnty
# Spp         185 189 31
#   Bitternut   2   1  0
#   Pignut      2   1  1
#   WO          1   0  2
ftable(mydf, row.vars="Spp", col.vars=c("Cnty", "Yr"))
#           Cnty  185       189        31     
#           Yr   1999 2000 1999 2000 1999 2000
# Spp                                         
# Bitternut         1    1    0    1    0    0
# Pignut            2    0    0    1    0    1
# WO                0    1    0    0    2    0
Run Code Online (Sandbox Code Playgroud)


Arh*_*ala 2

正如贾斯汀提到的,聚合可能就是您想要的。如果您将数据框命名为 foo,那么以下内容应该为您提供您想要的内容,即每个物种的个体数量,假设每行包含胡桃的行代表属于胡桃物种的唯一个体。注意我使用 foo$Age 来计算向量的长度,即属于每个物种的个体(行)的数量,但您可以使用 foo$Ht 或 foo$DBH 等。

aggregate(foo$Age, by = foo[c('Spp','Cnty')], length)
Run Code Online (Sandbox Code Playgroud)

干杯,

丹尼