Объединение двух (булевых) категориальных факторов двух новых - PullRequest
0 голосов
/ 02 июня 2018

Учитывая два логических, категориальных фактора, как я могу получить их комбинацию как третью категорию?

> my_data <- data.frame(a = c(0, 0, 1, 1, 1),
                        b = c(0, 1, 0, 1, 1))
> my_data
  a b
1 0 0
2 0 1
3 1 0
4 1 1
5 1 1

Я хочу добавить новую категорию с комбинацией a и b, чтобы:

> my_data
  a b c
1 0 0 1
2 0 1 2
3 1 0 3
4 1 1 4
5 1 1 4

Я не хотел быть ленивым и думал об этом сам:

my_data$c <- as.numeric(as.factor(my_data$a + 1 + (my_data$b + 1) * 2))

Это близко, но я не нахожу это особенно элегантным.Поэтому, любое более приятное решение в базе R будет оценено.Есть также пакеты, подобные reshape2, которые предлагают аналогичную функциональность.

Ответы [ 4 ]

0 голосов
/ 02 июня 2018

Общее решение с dplyr:

library(dplyr)
my_data %>% mutate(c = group_indices(.,a,b))
#   a b c
# 1 0 0 1
# 2 0 1 2
# 3 1 0 3
# 4 1 1 4
# 5 1 1 4

Базовый эквивалент:

temp <- unique(my_data)
temp$c <- seq(nrow(temp))
merge(my_data,temp)
#   a b c
# 1 0 0 1
# 2 0 1 2
# 3 1 0 3
# 4 1 1 4
# 5 1 1 4
0 голосов
/ 02 июня 2018

Другой вариант с базой R:

r <- rle(do.call(paste0, my_data))
r$values <- seq_along(r$values)
my_data$c <- inverse.rle(r)

Результат:

> my_data
  a b c
1 0 0 1
2 0 1 2
3 1 0 3
4 1 1 4
5 1 1 4

Укороченная версия кода выше:

r <- rle(do.call(paste0, my_data))$lengths
my_data$c <- rep(seq_along(r), r)
0 голосов
/ 02 июня 2018

Ожидаемый результат в вопросе - это просто ввод, рассматриваемый как числа в базе 2, преобразованные в базу 10 плюс 1.
Итак, в поисках функции, которая преобразуется из базы 2 в базу 10, я нашел принятый ответ на этот ТАК вопрос .

Так что это apply() передача этой функции во фрейм данных.

apply(my_data, 1, bitsToInt) + 1
#[1] 1 2 3 4 4
0 голосов
/ 02 июня 2018

Следующая логика кажется достаточной для всех предоставленных вами случаев.

my_data$c <- with(my_data, 2*a + b + 1)

my_data
  a b c
1 0 0 1
2 0 1 2
3 1 0 3
4 1 1 4
5 1 1 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...