Как написать условные операторы в R, не ограничиваясь функцией print ()? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть данные о характеристиках пациентов следующим образом:

enter image description here

Я хочу написать условное утверждение, чтобы вернуть соответствующее выживание пациентов в возрасте 50-60, 60-70 и> 70. Как я могу написать такое условное утверждение?

Ответы [ 3 ]

1 голос
/ 26 марта 2020

Вы можете использовать cut2 из Hmisc (или cut из базы R, если хотите):

Hmisc::cut2(dt$age, cuts = seq(50, 70, 10))

## base R solution:
cut(df$Age, breaks = c(min(df$Age), seq(50, 70, 10), max(df$Age)), lowest = TRUE, right = FALSE)

Редактировать: По запросу альтернативное решение с условными выражениями (в этом случае задает NA все значения ниже или равные 50):

df$age <- ifelse(df$Age <= 60 & df$Age > 50, "50-60", 
                  ifelse(df$Age <= 70 & df$Age > 60, "60-70", 
                         ifelse(df$Age > 70, ">70", NA)))
0 голосов
/ 26 марта 2020

Например, ваш data.frame такой:

set.seed(111)
df = data.frame(Gender=sample(1:2,100,replace=TRUE),
Age=sample(50:80,100,replace=TRUE),
target.TAA=sample(letters[1:5],100,replace=TRUE),
Surivial=rnbinom(100,mu=10,size=1))

Мы определяем возрастные группы:

df$ageGrp = cut(df$Age,breaks=c(50,60,70,+Inf),
labels=c("50-60","60-70",">70"),include.lowest=TRUE,right=FALSE)

Чтобы выжить, сделайте:

50-60 60-70   >70 
    9     5     5

Вы также можете сделать это в dplyr:

library(dplyr)
df %>% mutate(ageGrp=case_when(
       Age >= 50 & Age < 60 ~ "50-60",
       Age >= 60 & Age < 70 ~ "60-70",
       Age >= 70 ~ ">70"
     ))
   Gender Age target.TAA Surivial ageGrp
1        2  70          c        9    >70
2        1  68          b        6  60-70
3        2  50          a        1  50-60
4        1  74          c        0    >70
5        1  76          c        1    >70
6        1  77          d        0    >70

Из вышеприведенного вы можете сгруппировать по группам и рассчитать, например, Survival:

df %>% mutate(ageGrp=case_when(
       Age >= 50 & Age < 60 ~ "50-60",
       Age >= 60 & Age < 70 ~ "60-70",
       Age >= 70 ~ ">70"
     )) %>% group_by(ageGrp) %>%
summarize(Surivial=median(Surivial))

# A tibble: 3 x 2
  ageGrp Surivial
  <chr>     <dbl>
1 >70           5
2 50-60         9
3 60-70         5
0 голосов
/ 26 марта 2020

В base R (пакеты не требуются)

SurvivalByAge <- lapply(c("50:59","60:69","70:200"), function(X) df$Survival[unlist(lapply(eval(parse(text=X)),grep,df$Age))])
names(SurvivalByAge) <- c("50:59","60:69","70:200")
SurvivalByAge

$`50:59`
[1] 14  0  0  6

$`60:69`
[1] 5 3 5 5 7 7 4 7 9

$`70:200`
[1] 12  2 13  6  0

Или, в качестве альтернативы, получить сумму

SurvivalByAge <- lapply(c("50:59","60:69","70:200"), function(X) sum(df$Survival[unlist(lapply(eval(parse(text=X)),grep,df$Age))]))
names(SurvivalByAge) <- c("50:59","60:69","70:200")
SurvivalByAge

$`50:59`
[1] 20

$`60:69`
[1] 52

$`70:200`
[1] 33

Данные:

df <- data.frame(Age = c(59,63,71,67,48,78,65,65,73,78,56,67,69,43,58,61,60,75,66,56),Survival=c(6,5,12,4,10,6,5,7,2,0,14,7,9,6,0,3,5,13,7,0))
...