【问题标题】:Perform function on each level of multiple columns in R在R中的多列的每一级上执行功能
【发布时间】:2020-08-24 08:24:21
【问题描述】:

我需要在data.table 中的多个列的每个级别上执行一个函数。例如,使用来自survivallung 数据集:

library(survival)
library(data.table)
library(dplyr)

data(lung)
setDT(lung)

vars <- c("sex", "ph.ecog")
lung[, (vars) := lapply(.SD, factor), .SDcols = vars]

fit <- tibble()
for (i in levels(lung[, vars ])){
temp <-
coxph(
  Surv(time, status) ~ i,
  data = lung
) %>% 
broom::tidy(exp=T)
fit <- bind_rows(fit, temp)
  }

这不起作用 - 我怎样才能成功?

【问题讨论】:

  • 尝试从末尾删除第 4 行中的 %&gt;% 。它不像这样工作。将coxph 保存在一个新变量中,然后对其进行操作。不可能像您那样将%&gt;% 放入赋值运算符。
  • 你是对的,我编辑了它。但这并不能解决我的问题。

标签: r survival-analysis


【解决方案1】:

您要为vars 列的每个级别还是每个vars 列运行该函数?

对于后者,你可以这样做:

do.call(rbind,lapply(vars, function(x) {
  broom::tidy(coxph(reformulate(x, 'Surv(time, status)'), data = lung))
}))

#  term     estimate std.error statistic   p.value conf.low conf.high
#  <chr>       <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
#1 sex2       -0.531     0.167     -3.18 0.00149    -0.859     -0.203
#2 ph.ecog1    0.369     0.199      1.86 0.0634     -0.0205     0.758
#3 ph.ecog2    0.916     0.225      4.08 0.0000448   0.476      1.36 
#4 ph.ecog3    2.21      1.03       2.15 0.0314      0.197      4.22 

为了简化一点,因为您已经在使用data.table,您可以使用rbindlist 而不是do.call + rbind

要对数据中的级别运行此操作,您可以执行以下操作:

do.call(rbind, lapply(vars, function(x) do.call(rbind,
        lapply(levels(lung[[x]]), function(y) 
    broom::tidy(coxph(reformulate(x, 'Surv(time, status)'), 
            data = lung[lung[[x]] == y]))))))

【讨论】:

  • 谢谢。这解决了所述问题。但是,我想我已经足够清楚了。如果在另一种情况下,我想在多个列的每个 level 上执行一个函数,我该如何执行此操作?我是 cox reg 的情况,这当然是多余的。
  • 如何在没有任何循环的情况下运行一次迭代?
  • 例如。 survfit(Surv(时间,状态)〜ph.ecog,数据=肺[性别==1])。然后,我会对“性”的每个级别和多个其他列感兴趣。
  • 如果有帮助,请查看更新的答案。确保所有因子水平都存在于您的数据中。
  • 我看到这使用 coxph 函数有效,但不适用于我需要的 survfit 函数:do.call(rbind, lapply(vars, function(x) do.call(rbind, lapply(levels) (lung[[x]]), function(y) broom::tidy(survfit(reformulate(x, 'Surv(time, status)~ph.ecog'), data = lung[lung[[x]] == y]))))))
猜你喜欢
  • 2018-03-27
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
相关资源
最近更新 更多