Рандомизировать по столбцам для половины набора данных - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть набор данных для боев ММА.

Структура в настоящее время

Fighter 1, Fighter 2, Winner
x             y          x 
x             y          x
x             y          x
x             y          x
x             y          x

Моя проблема в том, что Fighter 1 = Winner, поэтому моя модель будет обучена так, что Fighter 1 всегда побеждает, что является проблемой.

Мне нужно иметь возможность произвольно поменять Fighter 1 и Fighter 2 на половину набора данных, чтобы победитель был представлен одинаково.

В идеале у меня было бы это

Fighter 1, Fighter 2, Winner
x            y         x
y            x         x
x            y         y
y            x         x
x            y         y

Есть ли способ рандомизировать по столбцам, не нарушая порядок строк ??

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Я предполагаю, что ваши x s и y s являются произвольными и просто заполнителями.Кроме того, я предполагаю, что вам нужно, чтобы столбец Winner оставался неизменным, вам просто нужно, чтобы победитель не всегда был в первом столбце.

Пример данных:

set.seed(42)
x <- data.frame(
  F1 = sample(letters, size = 5),
  F2 = sample(LETTERS, size = 5),
  stringsAsFactors = FALSE
)
x$W <- x$F1
x
#   F1 F2 W
# 1  x  N x
# 2  z  S z
# 3  g  D g
# 4  t  P t
# 5  o  W o

Выберите несколько строк для случайного изменения:

(ind <- sample(nrow(x), size = ceiling(nrow(x)/2)))
# [1] 3 5 4

Это означает, что мы ожидаем, что строки 3-5 будут изменены.

Теперь случайные изменения:

within(x, { tmp <- F1[ind]; F1[ind] = F2[ind]; F2[ind] = tmp; rm(tmp); })
#   F1 F2 W
# 1  x  N x
# 2  z  S z
# 3  D  g g
# 4  P  t t
# 5  W  o o

Строки1-2 все еще показывают F1 как W внутренний, а строки 3-5 показывают F2 как W внутренний.

0 голосов
/ 12 апреля 2019

Я также обнаружил, что этот код работает

matches_clean[, c("fighter1", "fighter2")] <- lapply(matches_clean[, c("fighter1", "fighter2")], as.character)

changeInd <- !!((match(matches_clean$fighter1, levels(as.factor(matches_clean$fighter1))) -
                  match(matches_clean$fighter2, levels(as.factor(matches_clean$fighter2)))) %% 2)


matches_clean[changeInd, c("fighter1", "fighter2")] <- matches_clean[changeInd, c("fighter2", "fighter1")]
...