首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提取子字符串作为dplyr::变体管道的一部分

如何提取子字符串作为dplyr::变体管道的一部分
EN

Stack Overflow用户
提问于 2017-12-04 09:28:52
回答 2查看 7.5K关注 0票数 2

我有以下数据框架:

代码语言:javascript
复制
library(tidyverse)

df <-  structure(list(pfc_chr = c("chr1", "chr1", "chr1", "chr1", "chr1", 
"chr1", "chr1", "chr1", "chr1", "chr1"), pfc_chr_st = c(3046442L, 
3119671L, 3164756L, 3167322L, 3210838L, 3212196L, 3249068L, 3268246L, 
3444892L, 3451544L), peak_name = c("XXX-ad_peak_1", "XXX-ad_peak_2a", 
"PMN_peak_2", "Ytb_peak_3", "PMN_peak_3", "XXX-ad_peak_6", 
"XXX-ad_peak_8", "PMN_peak_5", "XXX-ad_peak_11", "XXX-ad_peak_12"
)), .Names = c("pfc_chr", "pfc_chr_st", "peak_name"), row.names = c(NA, 
-10L), class = c("tbl_df", "tbl", "data.frame"))


df
#> # A tibble: 10 x 3
#>    pfc_chr pfc_chr_st      peak_name
#>      <chr>      <int>          <chr>
#>  1    chr1    3046442  XXX-ad_peak_1
#>  2    chr1    3119671 XXX-ad_peak_2a
#>  3    chr1    3164756     PMN_peak_2
#>  4    chr1    3167322     Ytb_peak_3
#>  5    chr1    3210838     PMN_peak_3
#>  6    chr1    3212196  XXX-ad_peak_6
#>  7    chr1    3249068  XXX-ad_peak_8
#>  8    chr1    3268246     PMN_peak_5
#>  9    chr1    3444892 XXX-ad_peak_11
#> 10    chr1    3451544 XXX-ad_peak_12

我想要做的是提取peak_name中的子字符串,作为dplyr管道的一部分。预期的最终结果是:

代码语言:javascript
复制
   pfc_chr pfc_chr_st      peak_name        new_col
1     chr1    3046442  XXX-ad_peak_1         XXX-ad
2     chr1    3119671 XXX-ad_peak_2a         XXX-ad
3     chr1    3164756     PMN_peak_2            PMN
4     chr1    3167322     Ytb_peak_3            Ytb
5     chr1    3210838     PMN_peak_3            PMN
6     chr1    3212196  XXX-ad_peak_6         XXX-ad
7     chr1    3249068  XXX-ad_peak_8         XXX-ad
8     chr1    3268246     PMN_peak_5            PMN
9     chr1    3444892 XXX-ad_peak_11         XXX-ad
10    chr1    3451544 XXX-ad_peak_12         XXX-ad

我试过但失败了:

代码语言:javascript
复制
> df %>% mutate(new_col = stringr::str_match(peak_name, "^(.*?)\\_peak\\_*?"))
Error in mutate_impl(.data, dots) : 
  Column `new_col` must be length 10 (the number of rows) or one, not 20

正确的方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-04 09:46:43

我建议使用前瞻性的stringr::str_extract()

代码语言:javascript
复制
df %>%
  mutate(new_col = stringr::str_extract(peak_name, "^.*(?=_peak)"))

结果如下:

代码语言:javascript
复制
> df %>%
+   mutate(new_col = stringr::str_extract(peak_name, "^.*(?=_peak)"))
# A tibble: 10 x 4
   pfc_chr pfc_chr_st      peak_name new_col
     <chr>      <int>          <chr>   <chr>
 1    chr1    3046442  XXX-ad_peak_1  XXX-ad
 2    chr1    3119671 XXX-ad_peak_2a  XXX-ad
 3    chr1    3164756     PMN_peak_2     PMN
 4    chr1    3167322     Ytb_peak_3     Ytb
 5    chr1    3210838     PMN_peak_3     PMN
 6    chr1    3212196  XXX-ad_peak_6  XXX-ad
 7    chr1    3249068  XXX-ad_peak_8  XXX-ad
 8    chr1    3268246     PMN_peak_5     PMN
 9    chr1    3444892 XXX-ad_peak_11  XXX-ad
10    chr1    3451544 XXX-ad_peak_12  XXX-ad

请注意,"_peak_8“之类的数据将返回空字符串;"peak_8”等数据将返回NA

票数 5
EN

Stack Overflow用户

发布于 2017-12-04 09:40:27

选择第二列。

代码语言:javascript
复制
df %>% mutate(new_col = stringr::str_match(peak_name, "^(.*?)\\_peak\\_*?")[, 2])

输出

代码语言:javascript
复制
    pfc_chr pfc_chr_st      peak_name new_col
1    chr1    3046442  XXX-ad_peak_1  XXX-ad
2    chr1    3119671 XXX-ad_peak_2a  XXX-ad
3    chr1    3164756     PMN_peak_2     PMN
4    chr1    3167322     Ytb_peak_3     Ytb
5    chr1    3210838     PMN_peak_3     PMN
6    chr1    3212196  XXX-ad_peak_6  XXX-ad
7    chr1    3249068  XXX-ad_peak_8  XXX-ad
8    chr1    3268246     PMN_peak_5     PMN
9    chr1    3444892 XXX-ad_peak_11  XXX-ad
10    chr1    3451544 XXX-ad_peak_12  XXX-ad
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47630140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档