2016-07-11 2 views
0

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

Category Country 
A   India 
B   Canada 
C   Ireland 
A   Ireland 
C   Canada 
A   India 
A   Canada 

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

Value 1 Value 2 Country 
A   A  India 
B   C  Canada 
B   A  Canada 
C   A  Canada 
C   A  Ireland 

В настоящее время я преобразуя его в матрицу и план по превращению его в длинном формате:

M=(as.matrix(table(df))) 

Но это просто дает мне резюме моего желаемого результата, где вместо получения отдельных строк для каждого Категория1, Категория2, Страна значение, я получу Категория1, Категория2, Граф (Страна) Значение.

Я новичок в data.table и впечатлен его скоростью. Мне особенно интересно узнать, есть ли эффективный метод data.table для этого.

ответ

2

Вы можете сделать

DF[, 
    CJ(Category, Category, unique=TRUE)[if (.N == 1L) TRUE else V1 > V2][order(-V1, -V2)] 
, by=Country] 

    Country V1 V2 
1: India A A 
2: Canada C B 
3: Canada C A 
4: Canada B A 
5: Ireland C A 

Как это работает: Попробуйте запустить его с шагом, со второй АРГ:

  • CJ(Category, Category, unique=TRUE)
  • CJ(Category, Category, unique=TRUE)[if (.N == 1L) TRUE else V1 > V2]
  • CJ(Category, Category, unique=TRUE)[if (.N == 1L) TRUE else V1 > V2][order(-V1, -V2)]

и читать ?CJ.

Комментарий. Вообще то, что вы просите здесь, это плохая идея в R и в data.table, если только для просмотра результата. Если вам необходимо провести дальнейший анализ, это, скорее всего, будет намного более удобным с вашими данными в длинном формате, а не в широком.

Смежные вопросы