首页 > 解决方案 > 将列表名称附加到 data.frames 的列中

问题描述

我已经导入了一个 data.frames 列表in1

in1 <- file_paths [1:3] %>% 
  set_names(basename(.) %>% 
              gsub("_R1_001.bg.gz.bismark.cov.gz", "", .) %>% 
              gsub("CpG_", "", .)) %>% 
  map(readr::read_tsv, n_max = 3, 
      col_names = c("chr", "start", "end", "score", "ref", "alt"))

(几个文件,几行)的一个小例子in1如下所示:

$`OB_0120-53T_S26`
# A tibble: 3 x 6
  chr   start   end score   ref   alt
  <chr> <int> <int> <int> <int> <int>
1 chr1  19190 19190   100     1     0
2 chr1  19249 19249   100     1     0
3 chr1  19274 19274   100     1     0

$`OB_0120-55T_S25`
# A tibble: 3 x 6
  chr   start   end score   ref   alt
  <chr> <int> <int> <int> <int> <int>
1 chr1  17479 17479   100     2     0
2 chr1  17484 17484   100     2     0
3 chr1  17493 17493   100     2     0

$`OB_0120-56T_S36`
# A tibble: 3 x 6
  chr   start   end score   ref   alt
  <chr> <int> <int> <int> <int> <int>
1 chr1  17479 17479   100     1     0
2 chr1  17484 17484   100     1     0
3 chr1  17493 17493   100     1     0

我的目标是将它们加入一个更大的data.frame,例如。

%>% reduce(full_join, by= c("chr", "start", "end"))

但是首先我想将每个元素的列表名称附加到“score”、“ref”和“alt”列名。

所以想要的第一个元素应该是这样的......

$`OB_0120-53T_S26`
    # A tibble: 3 x 6
      chr   start   end OB_0120-53T_S26.score   OB_0120-53T_S26.ref   OB_0120-53T_S26.alt
      <chr> <int> <int> <int> <int> <int>
    1 chr1  19190 19190   100     1     0
    2 chr1  19249 19249   100     1     0
    3 chr1  19274 19274   100     1     0

我尝试过使用set_names,但我不知道如何获取列表元素的单数名称我得到了整个名称向量,因此这是错误的。

in1 %>% map(set_names, c("chr", "start", "end", paste0(names(.), c(".score", ".ref", ".alt"))))

$`OB_0120-53T_S26`
# A tibble: 3 x 6
  chr   start   end `OB_0120-53T_S26.score` `OB_0120-55T_S25.ref` `OB_0120-56T_S36.alt`
  <chr> <int> <int>                   <int>                 <int>                 <int>
1 chr1  19190 19190                     100                     1                     0
2 chr1  19249 19249                     100                     1                     0
3 chr1  19274 19274                     100                     1                     0

有任何想法吗?

标签: rpurrr

解决方案


...实际上这有效

  in1 %>% 
      map2( ., names(.), 
      ~set_names(.x, c("chr", "start", "end", paste0(.y, c(".score", ".ref", ".alt")))))

$`OB_0120-53T_S26`
# A tibble: 3 x 6
  chr   start   end `OB_0120-53T_S26.score` `OB_0120-53T_S26.ref` `OB_0120-53T_S26.alt`
  <chr> <int> <int>                   <int>                 <int>                 <int>
1 chr1  19190 19190                     100                     1                     0
2 chr1  19249 19249                     100                     1                     0
3 chr1  19274 19274                     100                     1                     0

$`OB_0120-55T_S25`
# A tibble: 3 x 6
  chr   start   end `OB_0120-55T_S25.score` `OB_0120-55T_S25.ref` `OB_0120-55T_S25.alt`
  <chr> <int> <int>                   <int>                 <int>                 <int>
1 chr1  17479 17479                     100                     2                     0
2 chr1  17484 17484                     100                     2                     0
3 chr1  17493 17493                     100                     2                     0

推荐阅读