Как автоматически помещать значения в функцию

#r #function #for-loop #model #subset

#r #функция #for-цикл #Модель #подмножество

Вопрос:

У меня есть data.frame

                                       Team    Ability        SE
 Amur Khabarovsk           Amur Khabarovsk   0.0000000 0.0000000
 Sibir Novosibirsk       Sibir Novosibirsk  -0.2523662 0.7325424
 Lokomotiv Yaroslavl   Lokomotiv Yaroslavl   1.8614021 0.7883580
 HC Red Star Kunlun     HC Red Star Kunlun  -1.2255611 0.9341483
 HC Sochi                         HC Sochi  -0.2862795 0.7735475
 SKA St. Petersburg     SKA St. Petersburg   0.9110674 0.6958989
  

и у меня есть эта функция

 BT <- function(deltaa,deltab){
  exp(deltaa-deltab) / (1   exp(deltaa-deltab))
  

deltaa, deltab будут значениями из столбца возможностей в data.frame, т.е.

     > BT(    1.8614021,1.6718526    )
    [1] 0.547246


 How do I put these values in BT(function), based on team column of data.frame?
  

Я понял это, но как мне изменить имена команд в фильтрах, не делая этого вручную?

 BT(  home_team$Ability,away_team$Ability    )
        home_team <- filter(KHL_Abilities,Team==" Jokerit ")
        away_team <- filter(KHL_Abilities, Team==" HC Sochi ")
> BT(    home_team$Ability,away_team$Ability    )
[1] 0.8763307
  

Ответ №1:

Возможно, вы ищете это. Вы можете сохранить результаты для своей функции BT в новой переменной и вызвать ее в качестве первого аргумента переменной Ability . Здесь код:

 #Function
BT <- function(deltaa,deltab){
  exp(deltaa-deltab) / (1   exp(deltaa-deltab))}
#Create var
df$Result <- BT(deltaa = df$Ability,deltab = 1.6718526)
  

Вывод:

                  Team    Ability        SE     Result
1     Amur Khabarovsk  0.0000000 0.0000000 0.15817734
2   Sibir Novosibirsk -0.2523662 0.7325424 0.12739185
3 Lokomotiv Yaroslavl  1.8614021 0.7883580 0.54724600
4  HC Red Star Kunlun -1.2255611 0.9341483 0.05228156
5            HC Sochi -0.2862795 0.7735475 0.12366934
6  SKA St. Petersburg  0.9110674 0.6958989 0.31847582
  

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

 #Data
df <- structure(list(Team = c("Amur Khabarovsk", "Sibir Novosibirsk", 
"Lokomotiv Yaroslavl", "HC Red Star Kunlun", "HC Sochi", "SKA St. Petersburg"
), Ability = c(0, -0.2523662, 1.8614021, -1.2255611, -0.2862795, 
0.9110674), SE = c(0, 0.7325424, 0.788358, 0.9341483, 0.7735475, 
0.6958989)), row.names = c(NA, -6L), class = "data.frame")
  

Чтобы избежать фильтрации и других фреймов данных, попробуйте следующее:

 #Code
BT(df$Ability[df$Team=='Amur Khabarovsk'],df$Ability[df$Team=='HC Red Star Kunlun'])
  

Вывод (с использованием общих данных):

 [1] 0.7730407
  

Обновление: я внес некоторые изменения BT , чтобы вы могли использовать его с домашней / выездной командой:

 #Function 2
BT <- function(data,home,away){
  home <- subset(data,Team==home)
  away <- subset(data,Team==away)
  #Obtain values
  deltaa <- home$Ability
  deltab <- away$Ability
  exp(deltaa-deltab) / (1   exp(deltaa-deltab))}
#Apply
BT(df,home = 'Amur Khabarovsk',away = 'HC Red Star Kunlun')
  

Комментарии:

1. Ок, получил это ‘BT (home_team $ Ability, away_team $ Ability ) home_team <- filter (KHL_Abilities, Team ==» Йокерит «) away_team <- filter (KHL_Abilities, Team == » ХК Сочи «)’ Но я хочу, чтобы названия команд в фильтрах могли менятьсябез того, чтобы я делал это вручную

2. @Drew Я добавил обновление, также попробуйте с этим (нет необходимости создавать дополнительные фреймы данных): BT(df$Ability[df$Team=='Amur Khabarovsk'],df$Ability[df$Team=='HC Red Star Kunlun']) вы можете настроить команды по своему усмотрению. Надеюсь, это вам поможет!

3. Да, но то, что я пытаюсь сделать, это изменить команды в зависимости от того, кто играет в игру, не делая этого вручную?

4. @Drew У вас есть другой фрейм данных? Как вы определяете, кто играет, может быть, вектор значений?

5. @Drew Я добавил обновление с изменениями BT . Я надеюсь, что это может вам помочь!