Как создать новую переменную путем агрегирования двоичных элементов в R? - PullRequest
0 голосов
/ 04 мая 2019

У меня есть набор данных с 5 двоичными переменными.Теперь мне нужно агрегировать эти 5 бинарных переменных, чтобы создать новую переменную, с которой я затем буду запускать модель линейной регрессии.

Вот часть набора данных, который у меня есть:

   gender race b1 b2 b3 b4 b5 score
1       M    1  0  1  1  1  1    58
2       F    1  0  1  0  0  1    63
3       M    2  1  0  1  0  0    49
4       F    5  0  1  0  0  0    54
5       F    1  0  0  1  0  1    55
.   other    4  0  0  1  0  0    71
.       M    3  1  1  0  1  1    53
.   other    4  0  1  0  1  0    68

Я хотел бы использовать b1, b2, b3, b4 и b5 для создания переменной new, используя *Функция 1007 *, чтобы я мог запустить линейную регрессию следующим образом:

lm(score ~ gender + race + new, data = data)

Мой вопрос: как мне сделать, чтобы создать эту новую переменную путем агрегации 5 двоичных переменных, используя «sum» для аргумента FUN?

Ответы [ 2 ]

4 голосов
/ 04 мая 2019
> transform(d1, new = rowSums(d1[paste0("b", 1:5)]))
  gender race b1 b2 b3 b4 b5 score new
1      M    1  0  1  1  1  1    58   4
2      F    1  0  1  0  0  1    63   2
3      M    2  1  0  1  0  0    49   2
4      F    5  0  1  0  0  0    54   1
5      F    1  0  0  1  0  1    55   2
6  other    4  0  0  1  0  0    71   1
7      M    3  1  1  0  1  1    53   4
8  other    4  0  1  0  1  0    68   2
1 голос
/ 04 мая 2019

Использование альтернативного решения - tidyverse.Это ваш набор данных:

mydf <- structure(list(gender = c("M", "F", "M", "F", "F", "other", "M","other"), 
                           race = c(1L, 1L, 2L, 5L, 1L, 4L, 3L, 4L), b1 = c(0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L), 
                           b2 = c(1L, 1L, 0L, 1L, 0L, 0L, 1L, 1L), b3 = c(1L, 0L, 1L, 0L, 1L, 1L, 0L, 0L), 
                           b4 = c(1L, 0L, 0L, 0L, 0L, 0L, 1L, 1L), b5 = c(1L, 1L, 0L, 0L, 1L, 0L, 1L, 0L), 
                           score = c(58L, 63L, 49L, 54L, 55L, 71L, 53L, 68L)), 
                      class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8"))

Затем вы можете создать переменную 'new', используя функции mutate и rowSums

mydf %>% 
     mutate(new = rowSums(.[starts_with("b",vars = names(.))],na.rm = TRUE))

  gender race b1 b2 b3 b4 b5 score new
1      M    1  0  1  1  1  1    58   4
2      F    1  0  1  0  0  1    63   2
3      M    2  1  0  1  0  0    49   2
4      F    5  0  1  0  0  0    54   1
5      F    1  0  0  1  0  1    55   2
6  other    4  0  0  1  0  0    71   1
7      M    3  1  1  0  1  1    53   4
8  other    4  0  1  0  1  0    68   2
...