Запрет преобразования в фактор, когда количество столбцов в data.frame может быть уменьшено до одного

У меня есть процедура, которая может извлечь элементы из фрейма данных на основе списка условий в столбцах (см. Извлечение элементов из фрейма данных R с использованием критериев, заданных в виде списка (column_name = value)):

Вот фрейм данных и список условий:

> experimental_plan_1
  lib genotype treatment replicate
1   A       WT    normal         1
2   B       WT       hot         1
3   C      mut    normal         1
4   D      mut       hot         1
5   E       WT    normal         2
6   F       WT       hot         2
7   G      mut    normal         2
8   H      mut       hot         2
> condition_1 <- list(genotype="WT", treatment="normal")

Моя цель состоит в том, чтобы извлечь значения в lib столбец для строк, соответствующих критериям, приведенным в списке.

Я могу использовать следующую функцию для извлечения искомых значений:

> get_libs <- function(experimental_plan, condition) {experimental_plan[apply((experimental_plan[, names(condition)] == condition), 1, all), "lib"]}

Это хорошо работает с вышеупомянутым фреймом данных:

> get_libs(experimental_plan_1, condition_1)
[1] A E
Levels: A B C D E F G H

Тем не менее, я хотел бы, чтобы это было более общим: мой experimental_plan а также condition может иметь разные столбцы:

> experimental_plan_2
  lib genotype replicate
1   A       WT         1
2   B       WT         2
3   C       WT         3
4   D      mut         1
5   E      mut         2
6   F      mut         3
> condition_2 <- list(genotype="WT")

На этот раз это не удается:

> get_libs(experimental_plan_2, condition_2)
Error in apply((experimental_plan[, names(condition)] == condition), 1,  : 
  dim(X) must have a positive length

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

[1] A B C
Levels: A B C D E F

Как я могу написать функцию, которая выполняет ту же самую вещь более надежным способом?


Комментарий

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

Очевидно, R автоматически преобразует data.frame в фактор, когда количество столбцов, извлеченных из фрейма данных, уменьшается до одного:

> class(experimental_plan_1)
[1] "data.frame"
> class(experimental_plan_2)
[1] "data.frame"
> class(names(condition_1))
[1] "character"
> class(names(condition_2))
[1] "character"
> class(experimental_plan_1[, names(condition_1)])
[1] "data.frame"
> class(experimental_plan_2[, names(condition_2)])
[1] "factor"

Это идет вразрез с принципом наименьшего удивления. Я ожидаю, что вычисление вернет тот же тип вывода, когда вводятся данные того же типа.

0 ответов

Другие вопросы по тегам