【问题标题】:ggadjustedcurves error: Must use a vector in '[', not an object of class matrixggadjustedcurves 错误:必须在“[”中使用向量,而不是类矩阵的对象
【发布时间】:2019-03-20 22:16:07
【问题描述】:

ggadjustedcurves 错误:必须在 '[' 中使用向量,而不是类矩阵的对象

我打电话给rlang::last_trace() 得到这个:

> rlang::last_error()
<error>
message: Must use a vector in `[`, not an object of class matrix.
class:   `rlang_error`
backtrace:
  1. survminer::ggadjustedcurves(...)
  2. survminer:::ggadjustedcurves.average(data, fit, variable, size = size)
  4. base::sort.default(unique(data[, variable]))
  8. base::order(x, na.last = na.last, decreasing = decreasing)
  9. base::lapply(z, function(x) if (is.object(x)) as.vector(xtfrm(x)) else x)
 10. base:::FUN(X[[i]], ...)
 13. base::xtfrm.default(x)
 15. base::rank(x, ties.method = "min", na.last = "keep")
 17. tibble:::`[.tbl_df`(x, !nas)
 18. tibble:::check_names_df(i, x)

尝试使用分层变量绘制调整后的曲线。

【问题讨论】:

  • 您能否使用dput 包含您的数据以及您运行的导致错误的代码,以便我们重现它?
  • 错误信息比较奇怪。 [ 函数通常是在矩阵上使用的完全可接受的函数,但它是“通用的”。使用 tidyverse 有时很难知道哪些类对象抛出错误。您绝对应该发布minimal reproducible example

标签: r survival-analysis


【解决方案1】:

我有一个非常相似的问题,但是当我生成一个示例数据集来发布它时,这些图起作用了,这让我认为这是我的数据是一个问题。这是一个可重现的示例,其中两个图都生成得很好。

# generate reproducible data set
set.seed(3)
sampleData <- data.frame(Has_an_A_allele = sample(c("Yes", "No"), 1000, replace = TRUE),
                         Survival = rexp(1000, 0.5),
                         Censored = as.numeric(sample(c("1", "0"), 1000, replace = TRUE)),
                         Disease = sample(c("A", "B"), 1000, replace = TRUE),
                         Gender = sample(c("Male", "Female"), 1000, replace = TRUE),
                         Stage = sample(c("Early", "Advanced"), 1000, replace = TRUE),
                         Age = sample(c("Under 60", "Over 60"), 1000, replace = TRUE))
Summary(sampleData)

# create survival fit
fit<-survfit(Surv(Survival, Censored) ~ Has_an_A_allele, data = sampleData)

# create survival plot with p value
ggsurvplot(fit5, sampleData, xlim = c(0, 10), break.time.by = 2, pval = TRUE)

# create faceted survival plot with p value
ggsurvplot(fit5, sampleData, xlim = c(0, 10), break.time.by = 2, facet.by = "Disease", pval = TRUE)

当我在我的数据上运行此代码时,第一个图运行良好,但多面图返回此错误

> ggsurvplot(fit4, x1502, xlim = c(0, 10), break.time.by = 2, facet.by = "Gender", pval = TRUE)
Error: Must use a vector in `[`, not an object of class matrix.
Call `rlang::last_error()` to see a backtrace
> rlang::last_error()
<error>
message: Must use a vector in `[`, not an object of class matrix.
class:   `rlang_error`
backtrace:
  1. survminer::ggsurvplot(...)
  4. survminer::surv_group_by(data, grouping.vars = facet.by)
  5. survminer:::.levels(data[, grouping.vars])
  6. base::as.factor(x)
  7. base::factor(x)
  8. base::order(y)
  9. base::lapply(z, function(x) if (is.object(x)) as.vector(xtfrm(x)) else x)
 10. base:::FUN(X[[i]], ...)
 13. base::xtfrm.default(x)
 15. base::rank(x, ties.method = "min", na.last = "keep")
 17. tibble:::`[.tbl_df`(x, !nas)
 18. tibble:::check_names_df(i, x)

示例数据中使用的列名与我的数据集中的列名相同,数据类型相同,即除生存和审查之外的所有列都是因子。

编辑

我已经修复它,确定这绝对是一个数据问题,我查看了示例数据和我的数据的结构。

> str(x1502)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   450 obs. of  7 variables:

> str(sampleData)
'data.frame':   1000 obs. of  7 variables:

所以我使用x1502 &lt;- as.data.frame(x1502) 将我的数据转换为数据框,现在一切正常。希望这对您的数据思维习惯有用。

【讨论】:

  • @C Jones 感谢您的 cmets。它工作得很好。我按照您描述的方式将数据转换为数据帧并成功运行。
  • 我在尝试对输入数据为'tbl_df', 'tbl' 的生存曲线进行刻面时遇到了类似的错误。在上面运行as.data.frame 也解决了这个问题。
  • 在找到这个问题/答案之前,我已经尝试过数据帧转换,因此对修复对其他人有效感到失望。然后,我记得我的代码中有两个对象正在作用,我假设其中一个已经是一个数据框。我转换了另一个对象,它运行成功:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-08
相关资源
最近更新 更多