Коррелируйте данные из двух информационных фреймов в один, сохраняя оригинальную информацию - PullRequest
1 голос
/ 29 апреля 2019

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

Game1 <- structure(list(Score1 = c(5, 9), Score2 = c(4.8, 12.8), Score3 = c(7.22, 
2.3), Class = structure(2:1, .Label = c("Dwarf", "Paladin"), class = "factor"), 
    Race = structure(1:2, .Label = c("Dwarf,", "Elf"), class = "factor")), row.names = c("Stan", 
"Kyle"), class = "data.frame")

Game2 <- structure(list(Score1 = c(3, 8.1), Score2 = c(6.3, 6.6), Score3 = c(1.2, 
10.3), Class = structure(2:1, .Label = c("Rouge", "Wizard"), class = "factor"), 
    Race = structure(2:1, .Label = c("Gnome", "Human,"), class = "factor")), row.names = c("Cartman", 
"Kenny"), class = "data.frame")

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

Вывод, который я хочу получить от этого:

             Correlation Game1_Class Game1_Race Game2_Class Game2_Race

Stan:Cartman   -0.815    Paladin     Dwarf      Wizard      Human
Kyle:Cartman    0.942    Fighter     Elf        Wizard      Human
Stan:Kenny      0.947    Wizard      Human      Ranger      Gnome
Kyle:Kenny     -0.998    Rouge       Gnome      Ranger      Gnome

Я использовал родовую коэффициентную корреляцию для определения корреляций, я бы предпочел использовать Pearsons или Spearman.

Количество строк в каждом фрейме данных (в моих реальных данных) сильно отличается.

1 Ответ

2 голосов
/ 29 апреля 2019

вы можете определить пользовательскую функцию, которая создает такую ​​таблицу

name_combn <- expand.grid(rownames(Game1), rownames(Game2),stringsAsFactors = FALSE)

cor_table <- function(names,df1, df2){
   n1 <- as.character(names[1])
   n2 <- as.character(names[2])
   # 1:3 are the col. positions with numeric scores:
   r <- cor(as.numeric(df1[n1, 1:3]),as.numeric(df2[n2, 1:3])) 
  data.frame(names = paste(n1,":",n2, sep = ""),cor =r, 
             df1[n1, -c(1:3)],
             df2[n2, -c(1:3)], row.names = "")
}


df <- do.call(rbind,apply(name_combn, 1, cor_table, df1 = Game1, df2 = Game2))

 #  names         cor         Class   Race Class.1 Race.1
 #  Stan:Cartman -0.8154535   Paladin Dwarf  Wizard Human
 #  Kyle:Cartman  0.9472246   Dwarf   Elf    Wizard Human
 #  Stan:Kenny    0.9426604   Paladin Dwarf  Rouge  Gnome
 #  Kyle:Kenny   -0.9987835   Dwarf   Elf    Rouge  Gnome
...