R: повторно присвоить столбцы кадра данных на основе столбцов другого кадра данных - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть датафрейм под названием «samples», который выглядит так:

sample gender disease treatment
sample1      F     d   starved
sample2      F     c       fed
sample3      M     d   starved
sample4      M     d       fed
sample5      M     d   starved
sample6      M     c       fed
etc

Мне нужно импортировать это в скрипт, а затем в revvel () столбцы «пол», «болезнь» и «лечение».

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

Таким образом, цель в том, чтобы мой скрипт R импортировал файл конфигурации (YAML), который привел бы к data.frame, который выглядел бы примерно так и назывался бы «факторами»:

gender disease treatment
     F control       fed

Теперь, как я могу пройтись по этим «факторам», чтобы заставить его перебрасывать соответствующий столбец в «сэмплах» - обратите внимание, как я убедился, что имена столбцов совпадают между двумя фреймами данных . Я пробовал это до сих пор, но это не работает:

for (i in names(factors)){
  samples[[i]] <- relevel(samples[[i]], factors[[i]])
}

Я получаю сообщение об ошибке:

 Error in if (ref < 1 || ref > nlev) stop(gettextf("ref = %d must be in 1L:%d",  : 
  missing value where TRUE/FALSE needed
In addition: Warning messages:
1: In Ops.factor(ref, 1) : ‘<’ not meaningful for factors
2: In Ops.factor(ref, nlev) : ‘>’ not meaningful for factors

1 Ответ

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

Обратите внимание, что в приведенном вами примере есть несоответствие данных: factors содержит контрольный уровень для "disease", которого нет в samples: "control" против "c".Я предполагаю, что это опечатка, и factors (и ваш исходный файл YAML) на самом деле имеет опорный уровень "c" для столбца "disease" (см. Пример данных в конце публикации).

Кроме того, я предполагаю, что класс столбцов всех столбцов в samples и factors равен character.Это не должно быть критическим требованием, но я не проверял это для случаев, когда столбцы в samples или factors равны factor с.

Вот вариант, который должен обобщать довольно хорошо.

Мы выбираем все столбцы из samples , кроме samples$sample (который всегда присутствует в соответствии с описанием вашей проблемы), и используем purrr::imap, чтобы превратить столбцы в factors и relevelиспользуя опорный уровень из соответствующей записи столбца в factors.Остальное связывается с исходным столбцом samples$sample, чтобы получить окончательный перераспределенный samples.relevel data.frame.

samples.relevel <- bind_cols(
    samples %>% select(sample),
    samples %>%
        select(-sample) %>%
        imap(~ relevel(factor(.x), factors[[.y]])))
str(samples.relevel)
#'data.frame':  6 obs. of  4 variables:
# $ sample   : chr  "sample1" "sample2" "sample3" "sample4" ...
# $ gender   : Factor w/ 2 levels "F","M": 1 1 2 2 2 2
# $ disease  : Factor w/ 2 levels "c","d": 2 1 2 2 2 1
# $ treatment: Factor w/ 2 levels "fed","starved": 2 1 2 1 2 1

Образец данных

samples <- read.table(text =
    "sample gender disease treatment
sample1      F     d   starved
sample2      F     c       fed
sample3      M     d   starved
sample4      M     d       fed
sample5      M     d   starved
sample6      M     c       fed", header  = T, colClasses = "character")


factors <- read.table(text =
    "gender disease treatment
     F c       fed", header = T, colClasses = "character")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...