Использование цикла FOR для ввода данных из R (обзор кода) - PullRequest
0 голосов
/ 28 декабря 2018

Итак, моя цель - заполнить значения в последнем столбце фрейма данных.Фрейм данных [343,8].Я написал решение для этого, но оно не работает, и мне любопытно, почему моя идея не будет работать:

result = vector(length = 3)

for(i in 1:343){
  for(j in 1:3){
    result[j] = combos[i:j]
  }
  combos$prize[i] = score(result)
}

Имя большего фрейма данных - "комбо", последний столбецфрейм данных "приз".

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

Моя версия не работает, но в учебнике есть решение, которое работает:

for (i in 1:nrow(combos)) {
 symbols <- c(combos[i, 1], combos[i, 2], combos[i, 3])
 combos$prize[i] <- score(symbols)
 }

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

С учетом сказанного, что я не сделал правильно?

РЕДАКТИРОВАТЬ Это копия функции оценка , которую язвоню по моему за цикл:

score = function(symbols) {

# identify case
same = symbols[1] == symbols[2] & symbols[2] == symbols[3]
bars = symbols %in% c("B","BB","BBB")

# get prize
if (same) {
payouts = c("DD" = 100, "7" = 80, "BBB" = 40, "BB" = 25, "B" = 10, "C" = 10, 
"0" = 0)
prize = unname(payouts[symbols[1]])

} else if (all(bars)){
prize = 5 

} else {
cherries = sum("C" == symbols)
prize = c(0,2,5)[cherries + 1]
}

# adjust for diamonds
diamonds = sum("DD" == symbols)
prize * 2 ^(diamonds)

}

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Итак, ваша проблема в том, как вы создаете свои символы "вектор".Поскольку data.frame действительно считается типом «списка» в R, то, что вы делаете, это назначаете трехэлементный список вашей переменной символов.Следовательно, вам нужно будет удалить этот список, прежде чем вы сможете выполнить сравнение, которое вы ищете.

    for (i in 1:nrow(combos)) {
     symbols <- unlist(c(combos[i, 1], combos[i, 2], combos[i, 3]))
     combos$prize[i] <- score(symbols)
    }

Это должно решить вашу проблему, хотя я не могу точно протестировать без комбо data.frame, но я предполагаю, что это ваша проблемапросто глядя на код и сообщение об ошибке, которое вы получили.Удачи!

0 голосов
/ 28 декабря 2018

Обратите внимание, что i:j in combos[i:j] возвращает вектор от i до j.Попробуйте запустить 5:7 например.Итак, вы делаете "странное" подмножество с combos[i:j].Вы, вероятно, хотите, чтобы это было combos[i, j], которое возвращает (i, j) -ю запись комбо.

combos[i:j] возвращает записи с i-го по j-й числа combos (что, я полагаю,числовая матрица).В R матрицы хранятся в основном порядке столбцов, поэтому исходное подмножество возвращает соответствующие записи и может «охватывать столбцы».Взгляните на следующее, чтобы проиллюстрировать:

x <- matrix(1:6, 2, 3)

print(x)
#     [,1] [,2] [,3]
#[1,]    1    3    5
#[2,]    2    4    6

print(x[2:3])
#[1] 2 3

print(x[2,3])
#[1] 6

Итак,

result = vector(length = 3)
for(i in 1:343){
  for(j in 1:3){
    result[j] = combos[i, j]
  }
  combos$prize[i] = score(result)
}

работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...