【问题标题】:How to fix duplicate column names preventing plot_cells(cds) from running?如何修复阻止 plot_cells(cds) 运行的重复列名?
【发布时间】:2021-01-27 16:53:08
【问题描述】:
  1. 问题总结

我正在使用 monocle3 包进行 RNA-seq 分析。 在使用new_cell_data_set() 组合三个 .csv 文件(参见下面的代码)创建 cds 后,我尝试使用 plot_cells() 函数,但此错误消息不断出现:

Error: Column name `sample_name` must not be duplicated.

我运行 rlang::last_trace(),这是输出:

> rlang::last_trace()
x
+-<error/tibble_error_column_names_must_be_unique>
| Column name `sample_name` must not be duplicated.
\-<error/vctrs_error_names_must_be_unique>
  Names must be unique.
Backtrace:
     x
  1. \-monocle3::plot_cells(cds)
  2.   \-`%>%`(...)
  3.     +-base::withVisible(eval(quote(`_fseq`(`_lhs`)), env, env))
  4.     \-base::eval(quote(`_fseq`(`_lhs`)), env, env)
  5.       \-base::eval(quote(`_fseq`(`_lhs`)), env, env)
  6.         \-monocle3:::`_fseq`(`_lhs`)
  7.           \-magrittr::freduce(value, `_function_list`)
  8.             \-function_list[[i]](value)
  9.               +-dplyr::group_by(., cell_group)
 10.               \-dplyr:::group_by.data.frame(., cell_group)
 11.                 \-dplyr::grouped_df(groups$data, groups$group_names, .drop)
 12.                   \-dplyr:::compute_groups(data, vars, drop = drop)
 13.                     +-tibble::as_tibble(data)
 14.                     \-tibble:::as_tibble.data.frame(data)
 15.                       \-tibble:::lst_to_tibble(unclass(x), .rows, .name_repair)
 16.                         \-tibble:::set_repaired_names(x, .name_repair)
 17.                           +-rlang::set_names(...)
 18.                           \-tibble:::repaired_names(...)
 19.                             +-tibble:::subclass_name_repair_errors(...)
 20.                             | \-base::withCallingHandlers(...)
 21.                             \-vctrs::vec_as_names(...)
 22.                               \-(function () ...
 23.                                 \-vctrs:::validate_unique(names = names, arg = arg)
 24.                                   \-vctrs:::stop_names_must_be_unique(names, arg)
 25.                                     \-vctrs:::stop_names(...)
 26.                                       \-vctrs:::stop_vctrs(class = c(class, "vctrs_error_names"), ...)
  1. 我的尝试

根据我在 Google/stackoverflow 上研究问题时发现的情况,我尝试使用以下代码检查 cd 中的重复名称(请告诉我是否有更好的方法来检查重复的列名)(输出包括在内)。

duplicated(cds)
LogicalList of length 55
[[1]] logical(0)
[[2]] logical(0)
[[3]] logical(0)
[[4]] logical(0)
[[5]] logical(0)
[[6]] logical(0)
[[7]] logical(0)
[[8]] logical(0)
[[9]] logical(0)
[[10]] logical(0)
...
<45 more elements>
anyDuplicated(cds)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[28] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[46] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[55] FALSE
anyDuplicated(cds, fromLast = TRUE)
 [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[28] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[46] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[55] FALSE

我也查了pData(cds),59列中只有一列名为“sample_name”。

下面的代码似乎运行了,但是当我运行plot_cells(cds)时出现了相同的错误消息,当我重新检查pData(cds)时,列的名称仍然是“sample_name”,所以我不确定是否它做出了改变。

names(cds)[names(cds) == "sample_name"] <- "sample"

此外,我尝试了一个更具体的plot_cells() 版本,下面是输出中类似但不同的错误消息:

plot_cells(cds,color='cell_type_designation_label',show_trajectory_graph=FALSE,label_cell_groups=FALSE)
            Error: `data` must be uniquely named but has duplicate columns
rlang::last_trace()
        <error/rlang_error>
        `data` must be uniquely named but has duplicate columns
        Backtrace:
             x
          1. +-(function (x, ...) ...
          2. \-ggplot2:::print.ggplot(x)
          3.   +-ggplot2::ggplot_build(x)
          4.   \-ggplot2:::ggplot_build.ggplot(x)
          5.     \-ggplot2:::by_layer(function(l, d) l$compute_aesthetics(d, plot))
          6.       \-ggplot2:::f(l = layers[[i]], d = data[[i]])
          7.         \-l$compute_aesthetics(d, plot)
          8.           \-ggplot2:::f(..., self = self)
          9.             \-ggplot2:::scales_add_defaults(...)
         10.               \-base::lapply(aesthetics[new_aesthetics], eval_tidy, data = data)
         11.                 \-rlang:::FUN(X[[i]], ...)

colnames(cds) 显示每一列都以一个基因命名,并且由于有超过 1000 个基因,我不知道检查重复项的最简单方法(不应该存在)。

pData(cds)$sample_name 显示每个单元格的特定标签,其中也有超过 1000 个,因此很难检查重复。

供参考,

> dim(cds)
[1]    55 14771

因此,我认为重复的列/列名肯定存在问题,但我不知道在 cd 中的何处查找列重复的位置以及如何修复它。提前谢谢!

  1. 使用了其他代码

以下是用于组合三个 .csv 文件以创建 new_cell_data_set 的代码。为了使标签与特征匹配,必须与列/行进行一些对齐。

cds <- new_cell_data_set(expression_data = expression_matrix_2,
                                 cell_metadata = cell_metadata,
                                 gene_metadata = gene_annotation)

【问题讨论】:

  • 您可以检查validObject(cds) 是否返回TRUE,并进行一些测试,例如length(unique(pData(cds)$sample_name)) == length(pData(cds)$sample_name)colnames(cds) &lt;- make.names(colnames(cds), unique = TRUE)make.unique(colnames(cds)) 和类似的 - 这会将 .1、.2、.. 等附加到重复的名称(如果有)。
  • @user12728748 感谢您的建议!这是带有以下代码的输出:validObject(cds) [1] TRUE&gt; length(unique(pData(cds)$sample_name)) == length(pData(cds)$sample_name) [1] TRUE 我尝试了两种方法来使colnames(cds) 唯一,当代码行运行时,运行plot_cells(cds) 时发生了同样的错误。您知道为什么没有应用更改吗?谢谢!
  • 根据您的测试,colnames(cds) 是唯一的,但根据错误,colname sample_name 本身似乎存在问题。我不熟悉工作流程,但是小插图中的示例对您有用吗?您是否可能需要在运行之前运行额外的步骤,plot_cells,例如preprocess_cdsreduce_dimension?如果示例不起作用,也许重新安装软件包或从 github 安装最新版本可能会有所帮助。
  • @user12728748 我在plot_cells(cds) 之前运行过preprocess_cdsreduce_dimension,以及cluster_cells,这通常是有效的。抱歉,你指的是哪个小插曲?在尝试了其他一些想法之后,我还发现:&gt; which(duplicated(pData(cds)$sample_name)) integer(0)&gt; length(duplicated(pData(cds)$sample_name)) [1] 14771 我看不到如何复制所有值,因为总共有 14771 个值。当我运行colnames(cds) 时,每个列名都是一个不同的基因,所以我不确定问题是否来自于组合三个 .csv 文件。
  • @user12728748 在运行plot_cells(cds) 时没有产生影响并导致相同错误消息的故障排除:cds &lt;- cds[, !duplicated(pData(cds)$sample_name)]valid_column_names &lt;- make.names(names=names(cds), unique=TRUE, allow_ = TRUE) names(cds) &lt;- valid_column_namesvalid_column_names &lt;- make.names(names=names(pData(cds)), unique=TRUE, allow_ = TRUE) names(pData(cds)) &lt;- valid_column_namescds_2 &lt;- cds[, !duplicated(pData(cds)$sample_name) ]

标签: r ggplot2


【解决方案1】:

可能你的数据有一个 col 名称 'sample_name' ,只需删除它

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-01-16
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多