关于r:Mutate重复第一行的值

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)
}

但是当我将其应用于mutate(带有或不带有as.character)时,它将在新列中重复第一行的值。

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

当我使用sapply时(但我不想,我想使用dplyr管道的解决方案),它可以工作。

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

为什么mutate不能像我们期望的那样计算?我发现了这个问题,但没有提供答案,只有一个临时代码。

谢谢:)


您可以Vectorize您的函数以允许在每一行上发生突变:

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

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

或者,您可以在每行中使用rowwisemutate

1
2
3
df %>%
    rowwise() %>%
    mutate(genus = extract_genus(taxonomy))