Mutate repeats first row value
我有一个具有分类分配的数据集,我想在新列中提取属。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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") |
这是我的功能(有效)
1 2 3 4 5 | extract_genus <- function(str){ genus <- str_split(str, pattern =";")[[1]][6] genus %<>% str_sub(start = 4) #%>% as.character return(genus) } |
但是当我将其应用于
1 2 3 4 5 6 7 8 | 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 |
当我使用
1 2 3 4 5 6 7 8 | 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 |
为什么
谢谢:)
您可以
1 2 3 | ex_gen <- Vectorize(extract_genus, vectorize.args='str') df %>% mutate(genus=ex_gen(taxonomy)) |
或者,您可以在每行中使用
1 2 3 | df %>% rowwise() %>% mutate(genus = extract_genus(taxonomy)) |