Создание для l oop для 3 разных переменных с 3 разными условиями в R - PullRequest
0 голосов
/ 29 января 2020

Я пытаюсь решить знаменитую проблему Moneyball. У меня есть наборы данных, и я пытаюсь найти 3 игроков, которые соответствуют этим 3 условиям:

  1. Общая сумма заработной платы трех игроков не может превышать 15 миллионов долларов.
  2. Их общее количество At Bats (AB) должно быть равно или больше, чем у потерянных игроков.
  3. Их среднее значение OBP должно быть равно или больше, чем среднее значение OBP потерянных игроков. игроки

Вот мои значения:

  • Среднее значение OBP <- meanobp <- 0.3638687 </li>
  • At Bats Lost <- atbatslost <- 1469 </li>

Мои данные:

  • year2001 <- Все игроки 2001 года с указанием зарплаты, ОБП и АВ в столбцах. </li>

Для л oop, что я пытался, это не совсем работало:

for (x in 1:nrow(year2001)){
  for (y in 1:nrow(year2001)){
    for (z in 1:nrow(year2001)){
      if ((((year2001$salary[x]+year2001$salary[y]+year2001$salary[z]) <= 15000000)) = T & 
          ((year2001$AB[x]+year2001$AB[y]+year2001$AB[z]) >= 1469) = T & 
          (((year2001$OBP[x]+year2001$OBP[y]+year2001$OBP[z])/3) >= meanobp) = T){
        print(x)
        print(y)
        print(z)
         }
      }
  }
}

Когда я запускаю это, я получаю следующий результат:

>         print(x)
[1] 1
>         print(y)
[1] 1
>         print(z)
[1] 50
>       }
Error: unexpected '}' in "      }"
>     }
Error: unexpected '}' in "    }"
>   }
Error: unexpected '}' in "  }"
> }
Error: unexpected '}' in "}"

Я проверил, чтобы увидеть (1, 1, 50 ) строки дает мне ответ, и это не так.

Спасибо за помощь.

1 Ответ

0 голосов
/ 29 января 2020

Повторение некоторых комментариев - важно предоставить воспроизводимый пример вашей проблемы / вопроса. Вот одно из возможных решений того, что вы пытаетесь сделать; используя пакет dplyr.

library(dplyr)
set.seed(8675309)

player.names <- c("Jeff", "Stan", "Hadley", "Mary", "Helen", "Susan", "Mark", "Marcus", "Juan", "Pablo", "Aamir", "Geoff")
player.salaries <- 1:12 * 1000000
player.ab <- seq(1, 36, 3) * 100
player.obp <- runif(12, 0, 1)

player.df <- data.frame(name = player.names,
                        salary = player.salaries,
                        ab = player.ab,
                        obp = player.obp,
                        stringsAsFactors = FALSE)

player.combinations <- expand.grid(player1 = player.names,
                                   player2 = player.names,
                                   player3 = player.names,
                                   stringsAsFactors = FALSE) %>%
  mutate(p1.num = as.numeric(as.factor(player1)),
         p2.num = as.numeric(as.factor(player2)),
         p3.num = as.numeric(as.factor(player3))) %>% 
  ## filter step ensures no duplicates or flipped orderings
  filter(p1.num < p2.num, p2.num < p3.num) %>% 
  left_join(rename(player.df, p1.salary = salary, p1.ab=ab, p1.obp = obp), 
            by = c("player1"="name")) %>%
  left_join(rename(player.df, p2.salary = salary, p2.ab=ab, p2.obp = obp), 
            by = c("player2"="name")) %>%
  left_join(rename(player.df, p3.salary = salary, p3.ab=ab, p3.obp = obp), 
            by = c("player3"="name")) %>%
  filter(p1.salary+p2.salary+p3.salary<=15000000,
         p1.ab+p2.ab+p3.ab >= 1469,
         (p1.obp+p2.obp+p3.obp)/3 >= 0.3638687)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...