如何用DPLYR找到3个组间最共有的物种?

问题描述 投票:0回答:1

我想在一个有不同栖息地(变量 "hab",模式:TA,TB,TC)的数据框架中找到最常见的物种("spid "变量,它是用属名的4个首字母和物种名的4个首字母组成的代码)。

我不知道如何在每个生境中应用 "max n"("slice(which.max(n))")来选择这些生境中最常见的物种。举个例子,如果一个物种在一个生境中被计数50次,而在其他生境中被计数0次,与一个物种在每个生境中被计数10次相比,最后一个物种会更常见。

这是我开始的代码。

brk %>% 
  dplyr::select(spid,hab)%>%
  dplyr::group_by(spid) %>% 
  dplyr::mutate(n = length(unique(hab))) %>% 
  filter(n == 3)

一开始我想过滤3个生境中的物种,但我无法选择这些物种。但是我如何应用我的 "max "函数来选择最常见的物种?应用 "函数是一个好方法吗?

这里是一个可复制的代码。

library(dplyr)

brk%>%
  dplyr::select(spid,hab)%>%
  dplyr::sample_n(20)%>%
  dput()

structure(list(spid = structure(c(157L, 21L, 181L, 128L, 191L, 
197L, 202L, 122L, 179L, 150L, 15L, 162L, 43L, 202L, 154L, 179L, 
57L, 229L, 231L, 183L), .Label = c("ACROEMER", "ACROMEGA", "AEROSUBPM", 
"AMAZDIPL", "ANASAURI", "ANASPILI", "ANDRABER", "ANDRBILO", "ANEULATI", 
"BAZZDECR", "BAZZDECRM", "BAZZMASC", "BAZZNITI", "BAZZPRAE", 
"BAZZROCA", "BRACEURY", "BUCKMEMB", "CALYARGU", "CALYFISS", "CALYMASC", 
"CALYPALI", "CALYPERU", "CAMPARCTM", "CAMPAURE", "CAMPCRAT", 
"CAMPFLEX", "CAMPJAME", "CAMPROBI", "CAMPTHWA", "CEPHVAGI", "CERABELA", 
"CERACORN", "CERAZENK", "CHEICAME", "CHEICORDI", "CHEIDECU", 
"CHEIMONT", "CHEISERP", "CHEISURR", "CHEITRIF", "CHEIUSAM", "CHEIXANT", 
"COLOCEAT", "COLOHASK", "COLOHILD", "COLOOBLI", "COLOPEPO", "COLOTANZ", 
"COLOZENK", "COLUBENO", "COLUCALY", "COLUDIGI", "COLUHUMB", "COLUOBES", 
"COLUTENU", "CONOTRAP", "CRYPMART", "CUSPCONT", "CYCLBORB", "CYCLBREV", 
"CYLIKIAE", "DALTANGU", "DALTLATI", "DENDBORB", "DICRBILLB", 
"DIPLCAVI", "DIPLCOGO", "DIPLCORN", "DREPCULT", "DREPHELE", "DREPMADA", 
"DREPPHYS", "ECTRREGU", "ECTRVALE", "FISSASPL", "FISSMEGAH", 
"FISSSCIO", "FRULAPIC", "FRULAPICU", "FRULBORB", "FRULCAPE", 
"FRULGROS", "FRULHUMB", "FRULLIND", "FRULREPA", "FRULSCHI", "FRULSERR", 
"FRULUSAMR", "FRULVARI", "FUSCCONN", "GOTTNEES", "GOTTSCHI", 
"GOTTSPHA", "GROULAXO", "HAPLSTIC", "HERBDICR", "HERBJUNI", "HERBMAUR", 
"HETEDUBI", "HETESPLE", "HETESPN", "HOLOBORB", "HOLOCYLI", "HYPNCUPR", 
"ISOPCHRY", "ISOPCITR", "ISOPINTO", "ISOTAUBE", "JAEGSOLI", "JAEGSOLIR", 
"KURZCAPI", "KURZCAPIS", "LEJEALAT", "LEJEANIS", "LEJECONF", 
"LEJEECKL", "LEJEFLAV", "LEJELOMA", "LEJEOBTU", "LEJERAMO", "LEJETABU", 
"LEJETUBE", "LEJEVILL", "LEPIAFRI", "LEPICESP", "LEPIDELE", "LEPIHIRS", 
"LEPISTUH", "LEPISTUHP", "LEPTFLEX", "LEPTINFU", "LEPTMACU", 
"LEUCANGU", "LEUCBIFI", "LEUCBORY", "LEUCCANDI", "LEUCCAPI", 
"LEUCCINC", "LEUCDELI", "LEUCGRAN", "LEUCHILD", "LEUCISLE", "LEUCLEPE", 
"LEUCMAYO", "LEUCSEYC", "LOPHBORB", "LOPHCOAD", "LOPHCONC", "LOPHDIFF", 
"LOPHEULO", "LOPHMULT", "LOPHMURI", "LOPHNIGR", "LOPHSUBF", "MACRACID", 
"MACRMAUR", "MACRMICR", "MACRPALL", "MACRSERP", "MACRSULC", "MACRTENU", 
"MASTDICL", "METZCONS", "METZFURC", "METZLEPT", "METZMADA", "MICRAFRI", 
"MICRANKA", "MICRDISP", "MICRINFL", "MICRKAME", "MICROBLO", "MICRSTRA", 
"MITTLIMO", "MNIOFUSC", "PAPICOMP", "PLAGANGU", "PLAGDREP", "PLAGPECT", 
"PLAGRENA", "PLAGREPA", "PLAGRODR", "PLAGTERE", "PLEUGIGA", "PLICHIRT", 
"POLYCOMM", "POROELON", "POROMADA", "POROUSAG", "PRIOGRAT", "PSEUDECI", 
"PTYCSTRI", "PYRRSPIN", "RACOAFRI", "RADUANKE", "RADUAPPR", "RADUBORB", 
"RADUBORY", "RADUCOMO", "RADUEVEL", "RADUFULV", "RADUMADA", "RADUSTEN", 
"RADUTABU", "RADUVOLU", "RHAPCRIS", "RHAPGRAC", "RHAPRUBR", "RICCAMAZ", 
"RICCEROS", "RICCFAST", "RICCLIMB", "RICCLONG", "SCHLBADI", "SCHLMICRO", 
"SCHLOANGU", "SCHLSQUA", "SEMACRAS", "SEMASCHI", "SEMASUBP", 
"SERPCYRT", "SOLEBORG", "SOLEONRA", "SOLESPHA", "SPHATUMI", "SPHEMINU", 
"SYRRAFRI", "SYRRAPER", "SYRRDIMO", "SYRRGAUD", "SYRRHISP", "SYRRPOTT", 
"SYRRPROL", "SYRRPROLA", "SYZYPURP", "TAXICONFO", "TELACOAC", 
"TELADIAC", "TELANEMA", "TRICADHA", "TRICDEBE", "TRICPERV", "ULOTFULV", 
"WARBLEPT", "ZYGOINTE", "ZYGOREIN"), class = "factor"), hab = structure(c(3L, 
2L, 2L, 1L, 1L, 2L, 3L, 2L, 3L, 1L, 2L, 3L, 3L, 2L, 1L, 2L, 2L, 
1L, 1L, 2L), .Label = c("TA", "TB", "TC"), class = "factor")), row.names = c(NA, 
-20L), class = "data.frame")

谢谢你的帮助。

Germain V

r dplyr
1个回答
0
投票

我们可以尝试

library(dplyr)
brk %>%
   group_by(spid) %>%
   summarise(n = n_distinct(hab)) %>%
   slice(which.max(n))

0
投票

谢谢你的回答

我想根据这些物种在每个生境中的效果,列出一个在这3个生境中最常见的物种(代码蜘蛛)的列表。

spid        n_TA    n_TB    n_TC
DREPPHYS    6        1       1  
BUCKMEMB    4        4       4 
LEIJCOLE    0        0       0

在这个随机的例子中(我总共有246个物种),我想对这个数组进行计算,选择 "最常见的 "或 "最共享的物种"--在这种情况下,应该是BUCKMEMB,然后是DREPPHYS,最后是LEIJCOLE。

也许 "最大 "函数不是一个好方法 ?

© www.soinside.com 2019 - 2024. All rights reserved.