【问题标题】:dplyr::mutate() return "Error in Ops.factor(gene_id$symbol, x) : level sets of factors are different"dplyr::mutate() return "Ops.factor(gene_id$symbol, x) 中的错误:因子的水平集不同"
【发布时间】:2020-04-19 06:44:05
【问题描述】:

我的数据

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中添加一列可以找到human_gene对应的gene_id,所以我定义了一个函数

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

我知道在这种情况下我可以使用 join。但是,我想知道如果我需要在 dplyr::mutate 中使用函数,我应该怎么做。

另外,有时当我想在一列中使用一个值,输入一个函数,然后放入一个新列中,我会得到

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

谁能告诉我原因?谢谢

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    而不是==,使用match 来获取索引,因为== 进行元素比较,如果两个数据集的行数不同,它会在length 中产生问题,即它正在比较第1 行first 到 row1 on 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
    

    另外,在构造数据集时使用stringsAsFactors = FALSE 确保列是character 类而不是factor


    只要加入就可以轻松搞定

    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
    

    数据

    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)
    

    【讨论】:

    • 我收到一个错误[.data.frame(gene_id,gene_id$symbol %in% x) 中的错误:选择了未定义的列
    • @pill45 我在您的函数中注意到的一件事是您正在返回匹配的元素,但长度与gene_list 的行数不同。你的预期输出是什么。那应该是一个列表输出
    • @pill45 还是字符串列? gene_list %&gt;% mutate(new = toString(human_gene[human_gene %in% gene_id$symbol]))
    • 我只想要一个符号对应的gene_id,比如SLC02B1 return 23334; MMP13 返回 34553433
    • @pill45 然后加入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多