根据列名

时间:2017-10-24 21:04:46

标签: r subset

我想基于匹配前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种名称?

谢谢!

1 个答案:

答案 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