【发布时间】:2021-01-27 16:53:08
【问题描述】:
- 问题总结
我正在使用 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"), ...)
- 我的尝试
根据我在 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 中的何处查找列重复的位置以及如何修复它。提前谢谢!
- 使用了其他代码
以下是用于组合三个 .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) <- make.names(colnames(cds), unique = TRUE)或make.unique(colnames(cds))和类似的 - 这会将 .1、.2、.. 等附加到重复的名称(如果有)。 -
@user12728748 感谢您的建议!这是带有以下代码的输出:
validObject(cds) [1] TRUE> 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_cds和reduce_dimension?如果示例不起作用,也许重新安装软件包或从 github 安装最新版本可能会有所帮助。 -
@user12728748 我在
plot_cells(cds)之前运行过preprocess_cds和reduce_dimension,以及cluster_cells,这通常是有效的。抱歉,你指的是哪个小插曲?在尝试了其他一些想法之后,我还发现:> which(duplicated(pData(cds)$sample_name)) integer(0)> length(duplicated(pData(cds)$sample_name)) [1] 14771我看不到如何复制所有值,因为总共有 14771 个值。当我运行colnames(cds)时,每个列名都是一个不同的基因,所以我不确定问题是否来自于组合三个 .csv 文件。 -
@user12728748 在运行
plot_cells(cds)时没有产生影响并导致相同错误消息的故障排除:cds <- cds[, !duplicated(pData(cds)$sample_name)]valid_column_names <- make.names(names=names(cds), unique=TRUE, allow_ = TRUE) names(cds) <- valid_column_namesvalid_column_names <- make.names(names=names(pData(cds)), unique=TRUE, allow_ = TRUE) names(pData(cds)) <- valid_column_namescds_2 <- cds[, !duplicated(pData(cds)$sample_name) ]