2017-06-03 72 views
1

替換字符串中specfic列的每一行,我有以下tibble:如何使用dplyr和stringr


library(tidyverse) 

df <- tibble::tribble(
    ~sample, ~colB, ~colC, 
    "foo", 1, 2, 
    "bar_x", 2, 3, 
    "qux.6hr.ID", 3, 4, 
    "dog", 1, 1 
) 


df 
#> # A tibble: 4 x 3 
#>  sample colB colC 
#>  <chr> <dbl> <dbl> 
#> 1  foo  1  2 
#> 2  bar_x  2  3 
#> 3 qux.6hr.ID  3  4 
#> 4  dog  1  1 

df <- factor(final_df$samples, levels=c("bar_x","foo","qux.6hr.ID","dog")) 

    df 
#> [1] foo  bar_x  qux.6hr.ID dog  
#> Levels: bar_x foo qux.6hr.ID dog 

我想要做的就是每一行中sample列刪除這些子字符串:_x.6hr如果存在。決賽桌看起來像這樣:

 sample colB colC 
     foo  1  2 
     bar  2  3 
    qux.ID  3  4 
     dog  1  1 

我該如何做到這一點?

+1

'df%>%mutate(sample = gsub('_ x | \\。6hr','',sample))'或等同於stringr,'df%>%mutate(sample = str_replace_all(sample,'_x | \ \ .6hr',''))' – alistaire

+0

@alistaire其實我的df包含因子。查看我的更新。抱歉。我怎樣才能修改你的代碼? – pdubois

+1

'gsub'仍然有效,但它強制性格。你可以調用'levels <-',但是在dplyr語法中有點尷尬。 forcats包提供了一個替代方案:'df%>%mutate(sample = factor(sample),sample = forcats :: fct_relabel(sample,function(x){str_replace_all(x,'_x | \\。6hr','' )}))'雖然你必須把第二個參數作爲la laly函數來構造。 – alistaire

回答

1

我們可以使用

df %>% 
    mutate(sample = gsub("_x|\\.\\d+[A-Za-z]+", "", sample)) 
# A tibble: 4 x 3 
# sample colB colC 
# <chr> <dbl> <dbl> 
#1 foo  1  2 
#2 bar  2  3 
#3 qux.ID  3  4 
#4 dog  1  1 

如果「樣本」列factor類,不是我們可以對gsub的輸出與factor包或做這個樣本的levels

levels(df$sample) <- gsub("_x|\\.\\d+[A-Za-z]+", "", levels(df$sample)) 
df$sample 
#[1] foo bar qux.ID dog 
#Levels: bar foo qux.ID dog 
+0

其實我的df包含了因子。查看我的更新。抱歉。我怎樣才能修改你的代碼? – pdubois

+1

@pdubois'gsub'也會帶'factor'。如果保留爲「factor」,則用'factor'封裝輸出,即mutate(sample = factor(gsub(..' – akrun