我想基于匹配前14个字符将数据集划分为子集。每个列名都包含一个唯一的编号,因此我不希望按整个列名对它们进行分组。
有75种不同的物种,所以我想避免必须指定每种物种的名称,但使用一般表达式。
示例数据集是
pharomachrus_auriceps_136959<-c(10,30,11,12)
pharomachrus_auriceps_136675<-c(11,12,13,12)
trogon_personatus_100722<-c(12,14,15,13)
trogon_personatus_100766<-c(18,19,17,16)
new.spec<-cbind(pharomachrus_auriceps_136675, pharomachrus_auriceps_136959, trogon_personatus_100722, trogon_personatus_100766)
我试过这个
v <- unique(substr(names(new.specs), 0, 14))
subdata<-apply(v, function(x) select_(new.specs, ~matches(x)))
但它会给我一个列表,我需要一个数据框。
我想也许我可以用某种方式使用拆分,但是
subdata <- split(new.specs,v)
显然是一个天真的想法。
这样做的最佳方法是什么,以避免输入所有75种名称?
谢谢!
答案 0 :(得分:1)
也许这会有所帮助:
library(tidyverse)
new.spec %>%
as.tibble() %>%
gather() %>%
mutate(species = gsub("_\\d+", "", key)) %>%
split(., .[,'species'])
#output:
$pharomachrus_auriceps
# A tibble: 8 x 3
key value species
<chr> <dbl> <chr>
1 pharomachrus_auriceps_136675 11 pharomachrus_auriceps
2 pharomachrus_auriceps_136675 12 pharomachrus_auriceps
3 pharomachrus_auriceps_136675 13 pharomachrus_auriceps
4 pharomachrus_auriceps_136675 12 pharomachrus_auriceps
5 pharomachrus_auriceps_136959 10 pharomachrus_auriceps
6 pharomachrus_auriceps_136959 30 pharomachrus_auriceps
7 pharomachrus_auriceps_136959 11 pharomachrus_auriceps
8 pharomachrus_auriceps_136959 12 pharomachrus_auriceps
$trogon_personatus
# A tibble: 8 x 3
key value species
<chr> <dbl> <chr>
1 trogon_personatus_100722 12 trogon_personatus
2 trogon_personatus_100722 14 trogon_personatus
3 trogon_personatus_100722 15 trogon_personatus
4 trogon_personatus_100722 13 trogon_personatus
5 trogon_personatus_100766 18 trogon_personatus
6 trogon_personatus_100766 19 trogon_personatus
7 trogon_personatus_100766 17 trogon_personatus
8 trogon_personatus_100766 16 trogon_personatus
或者如果需要宽幅格式:
new.spec %>%
as.tibble() %>%
mutate(row = 1:nrow(.)) %>%
gather(key, value, -row) %>%
mutate(species = gsub("_\\d+", "", key)) %>%
split(.[['species']]) %>%
map(function(x) spread(x, 2, 3) %>%select(-row, - species))
#output:
$pharomachrus_auriceps
# A tibble: 4 x 2
pharomachrus_auriceps_136675 pharomachrus_auriceps_136959
* <dbl> <dbl>
1 11 10
2 12 30
3 13 11
4 12 12
$trogon_personatus
# A tibble: 4 x 2
trogon_personatus_100722 trogon_personatus_100766
* <dbl> <dbl>
1 12 18
2 14 19
3 15 17
4 13 16