Как создать метку на основе уникальных комбинаций строк матрицы в R? - PullRequest
2 голосов
/ 01 октября 2019

У меня есть матрица с 3 столбцами: первый столбец содержит Year, второй столбец содержит имя Country 1, а третий столбец содержит имя Country 2. Например,

> mat <- cbind(c(1900,1900,1900,1901,1901,1901),  
+              c("USA","USA","FRANCE","USA","USA", "FRANCE") ,  
+              c("FRANCE", "GERMANY", "GERMANY","FRANCE", "GERMANY", "GERMANY") )
> mat
     [,1]   [,2]     [,3]     
[1,] "1900" "USA"    "FRANCE" 
[2,] "1900" "USA"    "GERMANY"
[3,] "1900" "FRANCE" "GERMANY"
[4,] "1901" "USA"    "FRANCE" 
[5,] "1901" "USA"    "GERMANY"
[6,] "1901" "FRANCE" "GERMANY"

Я хочу создать метку для каждой комбинации. Например, я хотел бы получить вектор label = c(1,2,3,1,2,3), обозначающий различные комбинации. Я знаю, как это сделать грубой силой. Это означает создание списка уникальных комбинаций названий стран с пакетом, а затем сравнение каждой из этих комбинаций с каждой строкой mat и создание вектора label в цикле с помощью команды identical().

library(RcppAlgos)
cs <- as.character(unique(c(mat[,2],mat[,3])))
combos <- comboGeneral(cs, 2 , FALSE)

Однако моя матрица содержит 1000 000 строк и пару тысяч комбинаций названий стран, что делает этот процесс очень медленным.

ВОПРОС : есть ли более эффективный способсоздания вектора label, указывающего уникальные комбинации второй и третьей строк матрицы mat?

Ответы [ 2 ]

2 голосов
/ 01 октября 2019

Вы можете использовать совпадение в базе R:

mat <- cbind(c(1900,1900,1900,1901,1901,1901),  
                         c("USA","USA","FRANCE","USA","USA", "FRANCE") ,  
                         c("FRANCE", "GERMANY", "GERMANY","FRANCE", "GERMANY", "GERMANY") )


mat <- cbind(mat, paste(mat[,2], mat[,3]))
match(mat[,4], unique(mat[,4]))
1 голос
/ 01 октября 2019

Я немного запутался в выводе, хотя, если он соответствует выводу вашего данного кода;попробуйте следующее:

library(dplyr)

mat <- cbind(c(1900,1900,1900,1901,1901,1901),c("USA","USA","FRANCE","USA","USA", "FRANCE") ,  
c("FRANCE", "GERMANY", "GERMANY","FRANCE", "GERMANY", "GERMANY") )

mat1 = as_data_frame(mat) %>% 
  dplyr::mutate(labelCol = paste0(V2," ",V3))

allLabels = unique(mat1$labelCol)

Дайте мне знать, если это работает.

...