dplyr :: mutate () return "Ошибка в Ops.factor (gene_id $ symbol, x): наборы уровней факторов различны" - PullRequest
1 голос
/ 19 апреля 2020

Мои данные

gene_list <- data.frame(mouse_gene = c("Ccnb1", "Cdk1", "Cdh3", "Cdkn1c"),
                    human_gene = c("SLCO2B1", "PPP1R3C", "MMP13", "CLEC6A"))

gene_id <- data.frame(gene_id = c("23334", "100001", "12341236", "34553433", "22998", "123121213"),
                  symbol = c("SLCO2B1", "PPP1R3C", "FX-232", "MMP13", "CLEC6A", "CSCCD"))

Я хочу добавить столбец в gene_list, который может найти соответствующий gene_id для human_gene, поэтому я определил функцию

find_geneID <- function(x){
      ID <- gene_id[which(gene_id$symbol == x),1]
      return(ID)
}

Затем я использую dplyr: : mutate

gene_list <- gene_list %>% mutate(find_geneID(human_gene))

Однако я получаю возврат

Error in Ops.factor(gene_id$symbol, x) : level sets of factors are different

Я знаю, что я могу использовать соединение в этом случае. Тем не менее, я хотел бы знать, что мне делать, если мне нужно использовать функцию в dplyr :: mutate.

Кроме того, иногда, когда я хочу использовать значение в одном столбце, ввести в функцию и поместить в новый столбец, я получу

Column `new_column` must be length 568 (the number of rows) or one, not 2

Может кто-нибудь сказать мне причину ? Спасибо

1 Ответ

1 голос
/ 19 апреля 2020

Вместо ==, используйте match, чтобы получить индекс, потому что == выполняет поэлементное сравнение, и это создаст проблему в length, если оба набора данных имеют разное количество строк, т.е. он сравнивает строку1 из first to row1 на second, row2 -> row2, row3 -> row3, и значения могут быть в любом месте столбца, которые, вероятно, будут пропущены, если мы сделаем ==

find_geneID <- function(x) {gene_id$gene_id[match(gene_list[[x]], gene_id$symbol)]}
gene_list %>% 
       mutate(gene_id = find_geneID('human_gene'))
#  mouse_gene human_gene  gene_id
#1      Ccnb1    SLCO2B1    23334
#2       Cdk1    PPP1R3C   100001
#3       Cdh3      MMP13 34553433
#4     Cdkn1c     CLEC6A    22998

Кроме того, убедитесь, что столбцы character класса вместо factor при использовании stringsAsFactors = FALSE при построении наборов данных


Это можно легко сделать с помощью объединения

left_join(gene_list, gene_id, by = c('human_gene' = 'symbol'))
#  mouse_gene human_gene  gene_id
#1      Ccnb1    SLCO2B1    23334
#2       Cdk1    PPP1R3C   100001
#3       Cdh3      MMP13 34553433
#4     Cdkn1c     CLEC6A    22998

data

gene_list <- data.frame(mouse_gene = c("Ccnb1", "Cdk1", "Cdh3", "Cdkn1c"),
                    human_gene = c("SLCO2B1", "PPP1R3C", "MMP13", "CLEC6A"),
                     stringsAsFactors = FALSE)

gene_id <- data.frame(gene_id = c("23334", "100001", "12341236", 
    "34553433", "22998", "123121213"),
                  symbol = c("SLCO2B1", "PPP1R3C", "FX-232", 
     "MMP13", "CLEC6A", "CSCCD"), stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...