2017-01-31 5 views
2

Допустим, у меня есть три колонки, как эти:Группа категориальные значения

c1 c2 c3 
red one low 
blue two high 
red two low 
red one low 

Я пытаюсь выяснить, эффективный способ создания новых столбцов, которые кодируют записи по сходству. Результатом этого может быть что-то вроде этого:

c1 c2 c3 d1 
red one low 1 
blue two high 
red two low 
red one low 1 

С помощью этого универсального примера я мог варьировать количество столбцов, включенных, также определить, какие подмножества столбцов одинаковы между записями. Я предполагаю, что это может включать в себя алгоритм кластеризации k-mode, хотя я не понял, как получить такой вывод, как выше, что, конечно, можно легко использовать в качестве регрессоров.

Update

Из предложений до сих пор, команда взаимодействия, безусловно, самый элегантный (одна линия!), А также наиболее экономной, поскольку он кодирует все группы численно в одном столбце. Престижность thelatemail для этого предложения, и спасибо всем остальным за ваши другие подходы.

Позвольте мне сделать это более сложным и на самом деле ближе к тому, что мне нужно. Взяв пример выше, я мог бы также использовать частичное совпадение. Что, если две колонки согласны? Вывод может выглядеть (вроде), как этого

c1 c2 c3 g1 g2 
red one low 1 2 
blue two high 
red two low 2 
red one low 1 2 

Наряду с весами для групп:

group weight 
1  3 
2  2 

В этом примере группа 1 имеет вес 3, потому что все факторы согласились, в то время как группа 2 имеет вес 2, потому что только 2 из 3 факторов согласились.

Формат возвращаемых групп и весов для групп, очевидно, может выглядеть несколько иначе.

+2

Возможно, есть еще большая сложность, которую мне не хватает, но вы можете просто использовать 'взаимодействие' для обозначения соответствующих записей -' as.числовое (взаимодействие (dat, drop = TRUE)) ' – thelatemail

+0

Не могли бы вы пометить какой-нибудь anwer как правильный, если он решит вашу проблему, пожалуйста? благодаря – StefanK

ответ

1

Вот один из способов. Создайте новый фрейм данных с каждой уникальной комбинацией переменных, дают каждой комбинации коду, и объединить его обратно к первоначальным

tmp <- read.table(
    header = TRUE, 
    text = " 
    c1 c2 c3 
    red one low 
    blue two high 
    red two low 
    red one low") 

tmp2 <- expand.grid(
    c1 = unique(tmp$c1), 
    c2 = unique(tmp$c2), 
    c3 = unique(tmp$c3) 
) 

tmp2$code <- 1:nrow(tmp2) 

merge(tmp, tmp2, all.x = TRUE) 
2

Мне нравится расширить сетку ответа на rsoren, но есть более высокие числа в чем число строк исходных данных.

Если вы хотите начать с 1 как самого низкого уникального идентификатора и добавить числа последовательно, вам нужно немного его отрегулировать.

Это ваша таблица

original_data <- read.table(
    header = TRUE, 
    text = " 
    c1 c2 c3 
    red one low 
    blue two high 
    red two low 
    red one low") 

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

unique_data <- unique(original_data[,1:2]) 
unique_data$ID <- 1:nrow(unique_data) 

И объединить таблицы в конце:

final_data <- merge(original_data, unique_data) 
0

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

dat$group <- as.numeric(interaction(dat,drop=TRUE)) 
# c1 c2 c3 group 
#1 red one low  2 
#2 blue two high  1 
#3 red two low  3 
#4 red one low  2 
Смежные вопросы