создать новую переменную индикатора на основе значений существующих переменных - PullRequest
0 голосов
/ 17 мая 2018

У меня есть такой набор данных:

> dput(head(BurnData))
structure(list(Treatment = c(0L, 0L, 0L, 0L, 0L, 0L), Gender = c(0L, 
0L, 0L, 0L, 0L, 0L), Race = c(0L, 1L, 1L, 0L, 1L, 1L), Surface = c(15L, 
20L, 15L, 20L, 70L, 20L), head = c(0L, 0L, 0L, 1L, 1L, 1L), buttock = c(0L, 
0L, 0L, 0L, 1L, 0L), trunk = c(1L, 1L, 0L, 1L, 1L, 1L), `upper leg` = c(1L, 
0L, 1L, 0L, 1L, 0L), `lower leg` = c(0L, 0L, 1L, 0L, 0L, 0L), 
    `respiratory tract` = c(0L, 0L, 0L, 0L, 0L, 0L), type = c(2L, 
    4L, 2L, 2L, 2L, 4L), `excision time` = c(12L, 9L, 13L, 11L, 
    28L, 11L), excision = c(0L, 0L, 0L, 1L, 1L, 0L), `antibiotic time` = c(12L, 
    9L, 13L, 29L, 31L, 11L), antibiotic = c(0L, 0L, 0L, 0L, 0L, 
    0L), infection_t = c(12L, 9L, 7L, 29L, 4L, 8L), infection = c(0L, 
    0L, 1L, 0L, 1L, 1L)), .Names = c("Treatment", "Gender", "Race", 
"Surface", "head", "buttock", "trunk", "upper leg", "lower leg", 
"respiratory tract", "type", "excision time", "excision", "antibiotic time", 
"antibiotic", "infection_t", "infection"), row.names = c(NA, 
6L), class = "data.frame")

Я пытаюсь создать новую переменную, которая объединяет индикаторы head, buttock, trunk, upper leg, lower leg, respiratory tract в одну новую переменную индикатора, где 0 - это когда все индикаторы равны нулю, 1 - только head, 2 - только buttock, 3 ..., 7 - только respiratory tract и 8 - combination любого из них.

Я пытался сделать это с mutate, dplyr, но я не могу понять это правильно. Я не очень хорош в этом.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Вы также можете попробовать case_when, используя tidyverse

library(tidyverse)
d %>%
  select(head:`respiratory tract`) %>%
  mutate(res=case_when(rowSums(.) == 0 ~ 0,
                   rowSums(.) >  1 ~ 8,
                   head == 1 ~ 1,
                   buttock == 1 ~ 2, 
                   trunk == 1 ~ 3,
                   `upper leg`==1 ~ 4, 
                   `lower leg`==1~5, 
                   `respiratory tract`==1 ~ 6)) %>% 
  select(res) %>% 
  bind_cols(d,.)
  Treatment Gender Race Surface head buttock trunk upper leg lower leg respiratory tract type
1         0      0    0      15    0       0     1         1         0                 0    2
2         0      0    1      20    0       0     1         0         0                 0    4
3         0      0    1      15    0       0     0         1         1                 0    2
4         0      0    0      20    1       0     1         0         0                 0    2
5         0      0    1      70    1       1     1         1         0                 0    2
6         0      0    1      20    1       0     1         0         0                 0    4
  excision time excision antibiotic time antibiotic infection_t infection res
1            12        0              12          0          12         0   8
2             9        0               9          0           9         0   3
3            13        0              13          0           7         1   8
4            11        1              29          0          29         0   8
5            28        1              31          0           4         1   8
6            11        0              11          0           8         1   8

Или полностью используя элегантное решение Сотоса

 mutate(res=case_when(rowSums(.) == 0 ~ 0L,
                   rowSums(.) >  1 ~ 8L,
                   TRUE ~ max.col(.)))
0 голосов
/ 17 мая 2018

Вот подход с базой R с использованием оператора ifelse.

ifelse(rowSums(d1[5:10]) > 1, 8, 
        ifelse(rowSums(d1[5:10]) == 0, 0, max.col(d1[5:10])))
#1 2 3 4 5 6 
#8 3 8 8 8 8 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...