r - 如何按组查找唯一的因子名称
问题描述
我正在寻找独特的价值:物种(这里是称为“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))
显然它不会告诉我我想要什么。如何按栖息地找到独特物种的名称?
谢谢您的帮助,
解决方案
你可以试试:
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
推荐阅读
- c - if (strcmp(file_name, "stdout") == 0)?
- javascript - 尝试验证 sessionStorage 令牌并替换路径 - 在 reactjs 中不起作用
- java - 在 JavaFX 中,如何将字段声明为私有?
- django - 在 Django/Djongo 的另一个抽象模型中是否可以有一个抽象模型?
- sql - 从字符串中删除日期,转换为日期并检查是否等于今天的日期
- deep-learning - 有没有一种方便的方法可以只将 Pytorch 中的模型架构信息保存到 protobuf 规则文件中?
- terraform - 在通过 Terraform 部署初始 SQS 队列后添加 DLQ?
- android - 每X秒杀一次后如何打开android应用程序?
- ruby-on-rails - 如何遍历json导致ruby on rails?
- angularjs - 有没有办法以角度实现自定义图形?