使用矩阵表在data.frame中查找值

时间:2015-11-30 13:16:52

标签: r matrix

我的df看起来像这样:

 head(df)
 MATCHID COMPETITION            TEAM1              TEAM2 GOALS1 GOALS2 RESULT  EXPG1 EXPG2     DATUM     TIJD POINTS  DIFF
 1 1696873  Pro League   Standard Liège Sporting Charleroi      3      0  TEAM1  1.57  0.61 25-7-2014 18:30:00    0.4  0.96
 2 1696883  Pro League Waasland-Beveren        Club Brugge      0      2  TEAM2  1.29  1.18 26-7-2014 16:00:00    0.0  0.11

我想要做的是创建一个新列,我可以在TEAM1和TEAM2之间放置距离。因此,我创建了一个名为" club"看起来像这样:

           Arsenal Aston.Villa Burnley Chelsea Crystal.Palace Everton Hull.City Leicester.City Liverpool Manchester.City Manchester.United Newcastle.United
Arsenal        ""      "114.6"     "234.3" "10.1"  "12.5"         "209.3"  "182.4"   "98.5"         "208.8"   "208.2"         "199.6"           "273.7"         
Aston Villa    "114.6" ""          "122.6" "125.6" "153.2"        "97.8"  "137"     "41.5"         "97"      "96.4"          "87.8"            "205.1"         
Burnley        "234.3" "122.6"     ""      "245.2" "272.8"        "50.8"  "113"     "145.2"        "53.9"    "28.9"          "34.7"            "115.8"         
Chelsea        "10.1"  "125.6"     "245.2" ""      "9.7"          "221.1" "189.1"   "104.7"        "220.5"   "219.9"         "211.3"           "280.4"         
crystal Palace "12.5"  "153.2"     "272.8" "9.7"   ""             "229.5" "203.7"   "113.1"        "228.9"   "228.3"         "219.7"           "294.9"         
Everton        "209.3" "97.8"      "50.8"  "221.1" "229.5"        ""      "128.5"   "122.8"        "0.9"  

如果我尝试俱乐部(" Arsenal"," Aston.Villa")我的得到114.6

现在我想填写专栏#34;距离"对于整个df,使用这个公式:

 get_distance <- function(matrix,x,y){matrix[x,y]}

 df$distance <- sapply(clubs_names, get_distance(clubs_names, df$TEAM1, df$TEAM2))

但这并没有成功。我收到以下错误:

Error in matrix[x, y] : incorrect number of dimensions

关于我哪里出错的任何想法?

这些是我的输入值:

dput(head(clubs))
structure(c("", "114.6", "234.3", "10.1", "12.5", "209.3", "114.6",  
"", "122.6", "125.6", "153.2", "97.8", "234.3", "122.6", "", 
"245.2", "272.8", "50.8", "10.1", "125.6", "245.2", "", "9.7", 
"221.1", "12.5", "153.2", "272.8", "9.7", "", "229.5", "209.3", 
"97.8", "50.8", "221.1", "229.5", "", "182.4", "137", "113", 
"189.1", "203.7", "128.5", "98.5", "41.5", "145.2", "104.7", 
"113.1", "122.8", "208.8", "97", "53.9", "220.5", "228.9", "0.9", 
"208.2", "96.4", "28.9", "219.9", "228.3", "38", "199.6", "87.8", 
"34.7", "211.3", "219.7", "34.7", "273.7", "205.1", "115.8", 
"280.4", "294.9", "172.6", "7.8", "120.7", "240.3", "4.2", "12.6", 
"217.9", "90.3", "142.3", "261.8", "77.9", "85.3", "239.4", "154.6", 
"44.1", "83", "167.5", "175.9", "60.6", "267.9", "199.4", "112.3", 
"274.7", "289.2", "169.7", "199", "155", "263.1", "186.6", "195.1", 
"179.4", "4.8", "115", "234.6", "18.9", "27.3", "212.2", "121.4", 
"4.2", "118.4", "131.1", "139.5", "96", "9.6", "132.7", "250.6", 
"13.1", "15.3", "229.9"), .Dim = c(6L, 20L), .Dimnames = list(
c("Arsenal", "Aston Villa", "Burnley", "Chelsea", "crystal Palace", 
"Everton"), c("Arsenal", "Aston.Villa", "Burnley", "Chelsea", 
"Crystal.Palace", "Everton", "Hull.City", "Leicester.City", 
"Liverpool", "Manchester.City", "Manchester.United", "Newcastle.United", 
"Queens.Park.Rangers", "Southampton", "Stoke.City", "Sunderland", 
"Swansea.City", "Tottenham.Hotspur", "West.Bromwich.Albion", 
"West.Ham.United")))


 > dput(head(df))
structure(list(X = 1:6, MATCHID = c(1696873L, 1696883L, 1696879L, 
1696881L, 1696877L, 1696871L), COMPETITION = structure(c(11L, 
11L, 11L, 11L, 11L, 11L), .Label = c("2. Bundesliga", "Bundesliga", 
"Championship", "Eredivisie", "Ligue 1", "Ligue 2", "Premier League", 
"Premiership", "Primeira Liga", "Primera División", "Pro League", 
"Segunda División", "Serie A", "Serie B", "Süper Lig"), class = "factor"), 
TEAM1 = structure(c(248L, 276L, 153L, 281L, 167L, 14L), .Label = c("?stanbul   Ba?ak?ehir", 
"1860 München", "Aalen", "Aberdeen", "Académica", "ADO Den Haag", 
"AFC Bournemouth", "Ajaccio", "Ajax", "Akhisar Belediyespor", 
"Albacete", "Alcorcón", "Almería", "Anderlecht", "Angers", 
"Arles", "Arouca", "Arsenal", "Aston Villa", "Atalanta", 
"Athletic Club", "Atlético Madrid", "Augsburg", "Auxerre", 
"Avellino", "AZ", "Bal?kesirspor", "Barcelona", "Barcelona II", 
"Bari 1908", "Bastia", "Bayer Leverkusen", "Bayern München", 
"Be?ikta?", "Belenenses", "Benfica", "Birmingham City", "Blackburn Rovers", 
"Blackpool", "Boavista", "Bochum", "Bologna", "Bolton Wanderers", 
"Bordeaux", "Borussia Dortmund", "Borussia M'gladbach", "Brentford", 
"Brescia", "Brest", "Brighton & Hove Albion", "Burnley", 
"Bursaspor", "Caen", "Cagliari", "Cambuur", "Cardiff City", 
"Carpi", "Catania", "Celta de Vigo", "Celtic", "Cercle Brugge", 
"Cesena", "Charlton Athletic", "Châteauroux", "Chelsea", 
"Chievo", "Cittadella", "Clermont", "Club Brugge", "Córdoba", 
"Créteil", "Crotone", "Crystal Palace", "Darmstadt 98", "Deportivo Alavés", 
"Deportivo La Coruña", "Derby County", "Dijon", "Dordrecht", 
"Dundee", "Dundee United", "Eibar", "Eintracht Braunschweig", 
"Eintracht Frankfurt", "Elche", "Empoli", "Erzgebirge Aue", 
"Eski?ehirspor", "Espanyol", "Estoril", "Everton", "Evian TG", 
"Excelsior", "Fenerbahçe", "Feyenoord", "Fiorentina", "Fortuna Düsseldorf", 
"Freiburg", "Frosinone", "FSV Frankfurt", "Fulham", "Galatasaray", 
"Gazélec Ajaccio", "Gaziantepspor", "Gençlerbirli?i", "Genk", 
"Genoa", "Gent", "Getafe", "Gil Vicente", "Girona", "Go Ahead Eagles", 
"Granada", "Greuther Fürth", "Groningen", "Guingamp", "Hamburger SV", 
"Hamilton Academical", "Hannover 96", "Heerenveen", "Heidenheim", 
"Hellas Verona", "Heracles", "Hertha BSC", "Hoffenheim", 
"Huddersfield Town", "Hull City", "Ingolstadt", "Internazionale", 
"Inverness CT", "Ipswich Town", "Juventus", "Kaiserslautern", 
"Karabükspor", "Karlsruher SC", "Kas?mpa?a", "Kayseri Erciyesspor", 
"Kilmarnock", "Köln", "Konyaspor", "Kortrijk", "KV Oostende", 
"Las Palmas", "Latina", "Laval", "Lazio", "Le Havre", "Leeds United", 
"Leganés", "Leicester City", "Lens", "Levante", "Lierse", 
"Lille", "Liverpool", "Livorno", "Llagostera", "Lokeren", 
"Lorient", "Lugo", "Mainz 05", "Málaga", "Mallorca", "Manchester City", 
"Manchester United", "Marítimo", "Mechelen", "Mersin ?dmanyurdu", 
"Metz", "Middlesbrough", "Milan", "Millwall", "Mirandés", 
"Modena", "Monaco", "Montpellier", "Moreirense", "Motherwell", 
"Mouscron-Péruwelz", "NAC Breda", "Nacional", "Nancy", "Nantes", 
"Napoli", "Newcastle United", "Nice", "Nîmes", "Niort", "Norwich City", 
"Nottingham Forest", "Numancia", "Nürnberg", "Olympique Lyonnais", 
"Olympique Marseille", "Orléans", "Osasuna", "Paços de Ferreira", 
"Paderborn", "Palermo", "Parma", "Partick Thistle", "PEC Zwolle", 
"Penafiel", "Perugia", "Pescara", "Ponferradina", "Porto", 
"Pro Vercelli", "PSG", "PSV", "Queens Park Rangers", "Racing Santander", 
"Rayo Vallecano", "RB Leipzig", "Reading", "Real Betis", 
"Real Madrid", "Real Sociedad", "Real Valladolid", "Real Zaragoza", 
"Recreativo Huelva", "Reims", "Rennes", "Rio Ave", "Rizespor", 
"Roma", "Ross County", "Rotherham United", "Sabadell", "Saint-Étienne", 
"Sampdoria", "Sandhausen", "Sassuolo", "Schalke 04", "Sevilla", 
"Sheffield Wednesday", "Sivasspor", "Sochaux", "Southampton", 
"Spezia", "Sporting Braga", "Sporting Charleroi", "Sporting CP", 
"Sporting Gijón", "St. Johnstone", "St. Mirren", "St. Pauli", 
"Standard Liège", "Stoke City", "Stuttgart", "Sunderland", 
"Swansea City", "Tenerife", "Ternana", "Torino", "Tottenham Hotspur", 
"Toulouse", "Tours", "Trabzonspor", "Trapani", "Troyes", 
"Twente", "Udinese", "Union Berlin", "Utrecht", "Valencia", 
"Valenciennes", "Varese", "Vicenza", "Villarreal", "Virtus Entella", 
"Virtus Lanciano", "Vitesse", "Vitória Guimarães", "Vitória Setúbal", 
"Waasland-Beveren", "Watford", "Werder Bremen", "West Bromwich Albion", 
"West Ham United", "Westerlo", "Wigan Athletic", "Willem II", 
"Wolfsburg", "Wolverhampton Wanderers", "Zulte-Waregem"), class = "factor"), 
TEAM2 = structure(c(242L, 69L, 142L, 158L, 106L, 179L), .Label = c("?stanbul   Ba?ak?ehir", 
"1860 München", "Aalen", "Aberdeen", "Académica", "ADO Den Haag", 
"AFC Bournemouth", "Ajaccio", "Ajax", "Akhisar Belediyespor", 
"Albacete", "Alcorcón", "Almería", "Anderlecht", "Angers", 
"Arles", "Arouca", "Arsenal", "Aston Villa", "Atalanta", 
"Athletic Club", "Atlético Madrid", "Augsburg", "Auxerre", 
"Avellino", "AZ", "Bal?kesirspor", "Barcelona", "Barcelona II", 
"Bari 1908", "Bastia", "Bayer Leverkusen", "Bayern München", 
"Be?ikta?", "Belenenses", "Benfica", "Birmingham City", "Blackburn Rovers", 
"Blackpool", "Boavista", "Bochum", "Bologna", "Bolton Wanderers", 
"Bordeaux", "Borussia Dortmund", "Borussia M'gladbach", "Brentford", 
"Brescia", "Brest", "Brighton & Hove Albion", "Burnley", 
"Bursaspor", "Caen", "Cagliari", "Cambuur", "Cardiff City", 
"Carpi", "Catania", "Celta de Vigo", "Celtic", "Cercle Brugge", 
"Cesena", "Charlton Athletic", "Châteauroux", "Chelsea", 
"Chievo", "Cittadella", "Clermont", "Club Brugge", "Córdoba", 
"Créteil", "Crotone", "Crystal Palace", "Darmstadt 98", "Deportivo Alavés", 
"Deportivo La Coruña", "Derby County", "Dijon", "Dordrecht", 
"Dundee", "Dundee United", "Eibar", "Eintracht Braunschweig", 
"Eintracht Frankfurt", "Elche", "Empoli", "Erzgebirge Aue", 
"Eski?ehirspor", "Espanyol", "Estoril", "Everton", "Evian TG", 
"Excelsior", "Fenerbahçe", "Feyenoord", "Fiorentina", "Fortuna Düsseldorf", 
"Freiburg", "Frosinone", "FSV Frankfurt", "Fulham", "Galatasaray", 
"Gazélec Ajaccio", "Gaziantepspor", "Gençlerbirli?i", "Genk", 
"Genoa", "Gent", "Getafe", "Gil Vicente", "Girona", "Go Ahead Eagles", 
"Granada", "Greuther Fürth", "Groningen", "Guingamp", "Hamburger SV", 
"Hamilton Academical", "Hannover 96", "Heerenveen", "Heidenheim", 
"Hellas Verona", "Heracles", "Hertha BSC", "Hoffenheim", 
"Huddersfield Town", "Hull City", "Ingolstadt", "Internazionale", 
"Inverness CT", "Ipswich Town", "Juventus", "Kaiserslautern", 
"Karabükspor", "Karlsruher SC", "Kas?mpa?a", "Kayseri Erciyesspor", 
"Kilmarnock", "Köln", "Konyaspor", "Kortrijk", "KV Oostende", 
"Las Palmas", "Latina", "Laval", "Lazio", "Le Havre", "Leeds United", 
"Leganés", "Leicester City", "Lens", "Levante", "Lierse", 
"Lille", "Liverpool", "Livorno", "Llagostera", "Lokeren", 
"Lorient", "Lugo", "Mainz 05", "Málaga", "Mallorca", "Manchester City", 
"Manchester United", "Marítimo", "Mechelen", "Mersin ?dmanyurdu", 
"Metz", "Middlesbrough", "Milan", "Millwall", "Mirandés", 
"Modena", "Monaco", "Montpellier", "Moreirense", "Motherwell", 
"Mouscron-Péruwelz", "NAC Breda", "Nacional", "Nancy", "Nantes", 
"Napoli", "Newcastle United", "Nice", "Nîmes", "Niort", "Norwich City", 
"Nottingham Forest", "Numancia", "Nürnberg", "Olympique Lyonnais", 
"Olympique Marseille", "Orléans", "Osasuna", "Paços de Ferreira", 
"Paderborn", "Palermo", "Parma", "Partick Thistle", "PEC Zwolle", 
"Penafiel", "Perugia", "Pescara", "Ponferradina", "Porto", 
"Pro Vercelli", "PSG", "PSV", "Queens Park Rangers", "Racing Santander", 
"Rayo Vallecano", "RB Leipzig", "Reading", "Real Betis", 
"Real Madrid", "Real Sociedad", "Real Valladolid", "Real Zaragoza", 
"Recreativo Huelva", "Reims", "Rennes", "Rio Ave", "Rizespor", 
"Roma", "Ross County", "Rotherham United", "Sabadell", "Saint-Étienne", 
"Sampdoria", "Sandhausen", "Sassuolo", "Schalke 04", "Sevilla", 
"Sheffield Wednesday", "Sivasspor", "Sochaux", "Southampton", 
"Spezia", "Sporting Braga", "Sporting Charleroi", "Sporting CP", 
"Sporting Gijón", "St. Johnstone", "St. Mirren", "St. Pauli", 
"Standard Liège", "Stoke City", "Stuttgart", "Sunderland", 
"Swansea City", "Tenerife", "Ternana", "Torino", "Tottenham Hotspur", 
"Toulouse", "Tours", "Trabzonspor", "Trapani", "Troyes", 
"Twente", "Udinese", "Union Berlin", "Utrecht", "Valencia", 
"Valenciennes", "Varese", "Vicenza", "Villarreal", "Virtus Entella", 
"Virtus Lanciano", "Vitesse", "Vitória Guimarães", "Vitória Setúbal", 
"Waasland-Beveren", "Watford", "Werder Bremen", "West Bromwich Albion", 
"West Ham United", "Westerlo", "Wigan Athletic", "Willem II", 
"Wolfsburg", "Wolverhampton Wanderers", "Zulte-Waregem"), class = "factor"), 
GOALS1 = c(3L, 0L, 2L, 1L, 3L, 3L), GOALS2 = c(0L, 2L, 0L, 
0L, 1L, 1L), RESULT = structure(c(1L, 2L, 1L, 1L, 1L, 1L), .Label = c("TEAM1", 
"TEAM2"), class = "factor"), EXPG1 = c(1.57, 1.29, 1.03, 
1.76, 1.6, 1.27), EXPG2 = c(0.61, 1.18, 1.04, 1.24, 1.23, 
0.62), DATUM = structure(c(136L, 143L, 143L, 143L, 150L, 
150L), .Label = c("1-1-2015", "1-10-2014", "1-11-2014", "1-12-2014", 
"1-2-2015", "1-3-2015", "1-4-2015", "1-5-2015", "1-8-2014", 
"1-9-2014", "10-1-2015", "10-11-2014", "10-2-2015", "10-3-2015", 
"10-4-2015", "10-5-2015", "10-8-2014", "11-1-2015", "11-10-2014", 
"11-2-2015", "11-3-2015", "11-4-2015", "11-5-2015", "11-8-2014", 
"12-1-2015", "12-10-2014", "12-12-2014", "12-4-2015", "12-5-2015", 
"12-9-2014", "13-12-2014", "13-2-2015", "13-3-2015", "13-4-2015", 
"13-5-2015", "13-8-2014", "13-9-2014", "14-12-2014", "14-2-2015", 
"14-3-2015", "14-4-2015", "14-9-2014", "15-11-2014", "15-12-2014", 
"15-2-2015", "15-3-2015", "15-4-2015", "15-5-2015", "15-8-2014", 
"15-9-2014", "16-1-2015", "16-11-2014", "16-12-2014", "16-2-2015", 
"16-3-2015", "16-5-2015", "16-8-2014", "16-9-2014", "17-1-2015", 
"17-10-2014", "17-12-2014", "17-2-2015", "17-3-2015", "17-4-2015", 
"17-5-2015", "17-8-2014", "17-9-2014", "18-1-2015", "18-10-2014", 
"18-12-2014", "18-3-2015", "18-4-2015", "18-5-2015", "18-8-2014", 
"19-1-2015", "19-10-2014", "19-12-2014", "19-4-2015", "19-5-2015", 
"19-8-2014", "19-9-2014", "2-11-2014", "2-12-2014", "2-2-2015", 
"2-3-2015", "2-4-2015", "2-5-2015", "2-8-2014", "20-1-2015", 
"20-10-2014", "20-12-2014", "20-2-2015", "20-3-2015", "20-4-2015", 
"20-5-2015", "20-8-2014", "20-9-2014", "21-1-2015", "21-10-2014", 
"21-11-2014", "21-12-2014", "21-2-2015", "21-3-2015", "21-4-2015", 
"21-5-2015", "21-9-2014", "22-11-2014", "22-12-2014", "22-2-2015", 
"22-3-2015", "22-4-2015", "22-5-2015", "22-8-2014", "22-9-2014", 
"23-1-2015", "23-11-2014", "23-2-2015", "23-3-2015", "23-5-2015", 
"23-8-2014", "23-9-2014", "24-1-2015", "24-10-2014", "24-11-2014", 
"24-12-2014", "24-2-2015", "24-4-2015", "24-5-2015", "24-8-2014", 
"24-9-2014", "25-1-2015", "25-10-2014", "25-2-2015", "25-4-2015", 
"25-5-2015", "25-7-2014", "25-8-2014", "25-9-2014", "26-1-2015", 
"26-10-2014", "26-12-2014", "26-4-2015", "26-7-2014", "26-9-2014", 
"27-1-2015", "27-10-2014", "27-12-2014", "27-2-2015", "27-4-2015", 
"27-7-2014", "27-9-2014", "28-10-2014", "28-11-2014", "28-12-2014", 
"28-2-2015", "28-3-2015", "28-4-2015", "28-9-2014", "29-10-2014", 
"29-11-2014", "29-12-2014", "29-3-2015", "29-4-2015", "29-5-2015", 
"29-8-2014", "29-9-2014", "3-1-2015", "3-10-2014", "3-11-2014", 
"3-12-2014", "3-2-2015", "3-3-2015", "3-4-2015", "3-5-2015", 
"3-8-2014", "30-1-2015", "30-10-2014", "30-11-2014", "30-12-2014", 
"30-4-2015", "30-5-2015", "30-8-2014", "30-9-2014", "31-1-2015", 
"31-10-2014", "31-5-2015", "31-8-2014", "4-1-2015", "4-10-2014", 
"4-11-2014", "4-12-2014", "4-2-2015", "4-3-2015", "4-4-2015", 
"4-5-2015", "4-8-2014", "5-1-2015", "5-10-2014", "5-11-2014", 
"5-12-2014", "5-2-2015", "5-4-2015", "5-5-2015", "6-1-2015", 
"6-10-2014", "6-12-2014", "6-2-2015", "6-3-2015", "6-4-2015", 
"6-5-2015", "6-9-2014", "7-1-2015", "7-11-2014", "7-12-2014", 
"7-2-2015", "7-3-2015", "7-4-2015", "7-6-2015", "7-9-2014", 
"8-11-2014", "8-12-2014", "8-2-2015", "8-3-2015", "8-4-2015", 
"8-5-2015", "8-8-2014", "9-1-2015", "9-11-2014", "9-2-2015", 
"9-3-2015", "9-4-2015", "9-5-2015", "9-8-2014"), class = "factor"), 
TIJD = structure(c(35L, 25L, 33L, 33L, 9L, 25L), .Label = c("10:00:00", 
"10:30:00", "11:00:00", "11:15:00", "11:30:00", "11:45:00", 
"12:00:00", "12:15:00", "12:30:00", "12:45:00", "13:00:00", 
"13:05:00", "13:20:00", "13:30:00", "13:45:00", "14:00:00", 
"14:05:00", "14:15:00", "14:30:00", "14:45:00", "15:00:00", 
"15:15:00", "15:30:00", "15:45:00", "16:00:00", "16:15:00", 
"16:30:00", "16:45:00", "17:00:00", "17:15:00", "17:30:00", 
"17:45:00", "18:00:00", "18:15:00", "18:30:00", "18:45:00", 
"18:50:00", "18:55:00", "19:00:00", "19:15:00", "19:30:00", 
"19:45:00", "20:00:00", "20:15:00", "20:30:00", "20:45:00", 
"21:00:00", "21:15:00", "21:30:00", "22:00:00"), class = "factor"), 
POINTS = c(0.4, 0, 0.3, 0.2, 0.3, 0.3), DIFF = c(0.96, 0.11, 
-0.01, 0.52, 0.37, 0.65)), .Names = c("X", "MATCHID", "COMPETITION", 
"TEAM1", "TEAM2", "GOALS1", "GOALS2", "RESULT", "EXPG1", "EXPG2", 
"DATUM", "TIJD", "POINTS", "DIFF"), row.names = c(NA, 6L), class =  "data.frame")

1 个答案:

答案 0 :(得分:2)

尝试:

df$distance <- df2[cbind(df$team1, df$team2)]

说明:

您可以像我们在解决方案中一样使用像cbind(myrows, mycolumns)这样的矩阵进行子集化。来自?`[`的帮助:

  

第三种形式的索引是通过带有一列的数字矩阵   对于每个维度:索引矩阵的每一行然后选择一个   数组的元素,结果是向量。

可重复的例子:

set.seed(1130)
df <- data.frame(id=1:4, team1=LETTERS[1:4], team2=LETTERS[5:8])
df2 <- matrix(sample(16), nrow=4, dimnames=list(LETTERS[1:4], LETTERS[5:8]))

df$distance <- df2[cbind(df$team1, df$team2)]
df
#   id team1 team2 distance
# 1  1     A     E        2
# 2  2     B     F       16
# 3  3     C     G        7
# 4  4     D     H        9

附录 - 如果您想使用原始方法,请尝试:

get_distance <- function(mat,x,y) mat[x,y]
mapply(get_distance, mat=list(df2), x=df$team1, y=df$team2)
#[1]  2 16  7  9