Вывести только показать номер элемента в списке - PullRequest
0 голосов
/ 06 июля 2018

У меня есть векторы времени, статуса и пола, и я хотел бы провести анализ выживания:

time <- c(306,455,1010,210,883,1022,310,361,218,166)
status <- c(0,1,0,1,0,0,1,0,1,1)
gender <- c("Male","Male","Female","Female","Male","Female","Female","Female","Female","Female")

A <- survfit(Surv(time, status)~gender)

Затем я разделил таблицу:

library(broom)
library(dplyr)
B<-tidy(A, censored = TRUE) %>% 
  split(.$strata)

В этой таблице я хочу определенный столбец, поэтому я сделал цикл:

Time<-list()
Estimate<-list()
StdError<-list()

for (i in 1:length(B)){

  Time[i] <- B[[i]][1]
  Estimate[i] <- B[[i]][5]
  StdError[i] <- B[[i]][6]
}

И когда я пытаюсь извлечь и объединить столбец, используя cbind, я получаю такой результат:

result <- cbind(Time, Estimate, StdError)
>result
      Time      Estimate  StdError 
 [1,] Numeric,7 Numeric,7 Numeric,7
 [2,] Numeric,3 Numeric,3 Numeric,3

Может кто-нибудь объяснить мне, почему это произошло, и помочь мне исправить мой код, чтобы вывод получился следующим образом:

>result
      Time      Estimate  StdError 
 [1,] 166      0.8571429 0.1543033
      166      0.8571429 0.1543033
      210      0.7142857 0.2390457
      218      0.5714286 0.3273268
      310      0.4285714 0.4364358
      361      0.4285714 0.4364358
      1010     0.4285714 0.4364358
      1022     0.4285714 0.4364358  

 [2,] Time     Estimate   StdError 
      306      1.0       0.0000000
      455      0.5       0.7071068
      883      0.5       0.7071068

1 Ответ

0 голосов
/ 06 июля 2018

Мы можем использовать lapply

lapply(B,  function(x) x[c('time', 'estimate', 'std.error')])

или без анонимной функции

lapply(B, `[`, c('time', 'estimate', 'std.error'))
#$`gender=Female`
#  time  estimate std.error
#1  166 0.8571429 0.1543033
#2  210 0.7142857 0.2390457
#3  218 0.5714286 0.3273268
#4  310 0.4285714 0.4364358
#5  361 0.4285714 0.4364358
#6 1010 0.4285714 0.4364358
#7 1022 0.4285714 0.4364358

#$`gender=Male`
#   time estimate std.error
#8   306      1.0 0.0000000
#9   455      0.5 0.7071068
#10  883      0.5 0.7071068

Объекты 'Time', 'Estimate' и 'StdError' равны list, мы можем cbind, зацикливаясь на элементах list с Map

Map(cbind, Time = Time, Estimate = Estimate, StdError = StdError)

Если мы хотим использовать цикл for, другим вариантом является не создание отдельных векторов, а непосредственное подмножество набора данных

out <- vector("list", length(B))
for(i in seq_along(B)) out[[i]] <- B[[i]][c(1, 5, 6)]
...