首页 > 解决方案 > 如何按组查找唯一的因子名称

问题描述

我正在寻找独特的价值:物种(这里是称为“SPID”的物种代码,属名的前四个字母来自物种名称的前四个字母)-在我的数据框的不同组中:栖息地(有 3栖息地(变量“hab”),命名为 TA、TB 和 TC)。

这是我的数据的输出:

library(dplyr)

brk%>%
+   dplyr::select(spid,hab)%>%
+   dplyr::sample_n(20)%>%
+   dput()
structure(list(spid = structure(c(127L, 78L, 33L, 162L, 81L, 
72L, 72L, 196L, 196L, 241L, 240L, 238L, 190L, 181L, 188L, 162L, 
214L, 13L, 178L, 78L), .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(1L, 
3L, 3L, 2L, 3L, 2L, 1L, 2L, 3L, 1L, 2L, 2L, 3L, 1L, 2L, 1L, 3L, 
2L, 3L, 2L), .Label = c("TA", "TB", "TC"), class = "factor")), row.names = c(NA, 
-20L), class = "data.frame")

我试过:


dplyr::select(spid,hab)%>%
 dplyr::group_by(hab)%>%
 dplyr::summarise(n_distinct(spid))

显然它不会告诉我我想要什么。如何按栖息地找到独特物种的名称?

谢谢您的帮助,

标签: rdplyr

解决方案


你可以试试:

df <- dplyr::select(brk, spid, hab)

lapply(split(df, df$hab), unique)

这将为您提供一个列表,其中包含每个栖息地的一个数据框,列中包含独特的物种spid

$TA
       spid hab
1  LEPIHIRS  TA
7  DREPPHYS  TA
10 TRICDEBE  TA
14 PLAGREPA  TA
16 MASTDICL  TA

$TB
       spid hab
4  MASTDICL  TB
6  DREPPHYS  TB
8  RADUAPPR  TB
11 TRICADHA  TB
12 TELADIAC  TB
15 POROMADA  TB
18 BAZZNITI  TB
20 FRULAPIC  TB

$TC
       spid hab
2  FRULAPIC  TC
3  CERAZENK  TC
5  FRULCAPE  TC
9  RADUAPPR  TC
13 PRIOGRAT  TC
17 SCHLBADI  TC
19 PLAGDREP  TC

根据澄清进行编辑:

df2 <- as.data.frame(table(df$spid, df$hab)[rowSums(table(df$spid, df$hab))==1,])
df2[df2$Freq != 0,]
#>        Var1 Var2 Freq
#> 4  LEPIHIRS   TA    1
#> 6  PLAGREPA   TA    1
#> 12 TRICDEBE   TA    1
#> 13 BAZZNITI   TB    1
#> 19 POROMADA   TB    1
#> 22 TELADIAC   TB    1
#> 23 TRICADHA   TB    1
#> 26 CERAZENK   TC    1
#> 27 FRULCAPE   TC    1
#> 29 PLAGDREP   TC    1
#> 32 PRIOGRAT   TC    1
#> 33 SCHLBADI   TC    1


推荐阅读