在R中多个列的每个级别上执行功能

问题描述

我需要在data.table中的多个列的每个级别上执行一个功能。例如,使用lung中的survival数据集:

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)
  }

这不起作用-我如何成功?

解决方法

您要为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,function(x) do.call(rbind,lapply(levels(lung[[x]]),function(y) 
    broom::tidy(coxph(reformulate(x,data = lung[lung[[x]] == y]))))))