2017-08-14 52 views
0

我有一個數據集分類分配,我想提取一個新的列中的屬。突變重複第一行值

library(tidyverse) 
library(magrittr) 
library(stringr) 


df <- structure(list(C043 = c(18361L, 59646L, 27575L, 163L, 863L, 3319L, 
           0L, 6L), C057 = c(20020L, 97610L, 13427L, 1L, 161L, 237L, 2L, 
               105L), taxonomy = structure(c(3L, 2L, 1L, 6L, 4L, 4L, 5L, 2L), .Label = c("k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Enterobacter;NA", 
                                  "k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Enterobacter;s__cloacae", 
                                  "k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Escherichia;s__coli", 
                                  "k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Klebsiella;s__", 
                                  "k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Pseudomonadales;f__Pseudomonadaceae;g__Pseudomonas;s__", 
                                  "k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Pseudomonadales;f__Pseudomonadaceae;g__Pseudomonas;s__stutzeri" 
               ), class = "factor")), .Names = c("C043", "C057", "taxonomy"), row.names = c(1L, 
                                  2L, 3L, 4L, 5L, 6L, 8L, 10L), class = "data.frame") 

所以這是我的函數(它的工作原理)

extract_genus <- function(str){ 
    genus <- str_split(str, pattern = ";")[[1]][6] 
    genus %<>% str_sub(start = 4) #%>% as.character 
    return(genus) 
} 

但是,當我應用它mutate(有或沒有as.character),它重複在新列第一行的值。

df %>% mutate(genus = extract_genus(taxonomy)) 

    C043 C057                             taxonomy  genus 
1 18361 20020  k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Escherichia;s__coli Escherichia 
2 59646 97610 k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Enterobacter;s__cloacae Escherichia 
3 27575 13427   k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Enterobacter;NA Escherichia 
4 163  1  k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Pseudomonadales;f__Pseudomonadaceae;g__Pseudomonas;s__stutzeri Escherichia 
5 863 161   k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Klebsiella;s__ Escherichia 

當我使用sapply(但我不想,我想與dplyr管道解決方案),它的工作原理。

df_group_gen$genus <- sapply(df_group_gen$taxonomy, extract_genus) 

    C043 C057                             taxonomy  genus 
1 18361 20020  k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Escherichia;s__coli Escherichia 
2 59646 97610 k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Enterobacter;s__cloacae Enterobacter 
3 27575 13427   k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Enterobacter;NA Enterobacter 
4 163  1  k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Pseudomonadales;f__Pseudomonadaceae;g__Pseudomonas;s__stutzeri Pseudomonas 
5 863 161   k__Bacteria;p__Proteobacteria;c__Gammaproteobacteria;o__Enterobacteriales;f__Enterobacteriaceae;g__Klebsiella;s__ Klebsiella 

爲什麼mutate不能像我們預期的那樣計算?我找到這個question,但沒有提供答案,只有一個有特別代碼。

謝謝:)

+2

矢量化函數將與mutate'extract_genus2 < - Vectorize(extract_genus)'一起使用。 –

+1

或使用'purrr':'df%>%mutate(genus = map(taxonomy,extract_genus))'。 – Axeman

回答

1

您可以Vectorize你的函數允許發生變異的每一行上出現:

ex_gen <- Vectorize(extract_genus, vectorize.args='str') 

df %>% mutate(genus=ex_gen(taxonomy)) 

或者,您可以使用rowwisemutate每一行:

df %>% 
    rowwise() %>% 
    mutate(genus = extract_genus(taxonomy)) 
+0

它適用於這兩種方法,謝謝:)(但與'group_by',它創建一個新的列,所以我更喜歡'Vectorize'解決方案) – AntoineBic

+1

'group_by(rownames(。))'可以只是'rowwise'? – Axeman

+1

謝謝!我通常不會使用'rowwise',但看起來更優雅。更新答案以包含'rowwise'。 –