Я очень часто использую логические векторы для подмножества других векторов, матриц и фреймов данных (в поле геномики это очень распространено). На такой вектор будет сделано так:R: подмножество многих объектов эффективно
condition <- myNucleotideVector == "G"
тогда я работаю на подмножества, соответствующих этому условию. Поэтому я часто в конечном итоге с неуклюжим кода, как:
myNucleotideVector <- myNucleotideVector[condition]
object2 <- object2[condition]
dataframe1 <- dataframe1[conditon,]
или
result <- myNucleotideVector[condition] - object2[condition] + dataframe1[conditon,2]
который повторяет [condition]
много раз. Я мог бы поместить все векторы одинакового размера и кадр данных и подмножество, но я не всегда хочу это делать (в частности, учитывая длину векторов, которые могут быть миллионами).
Я ищу эффективное решение. В первом случае, приведенном выше, я думал о функции, которая принимает любой объект, предоставленный в качестве аргумента, и подмножества. Это будет выглядеть
subsetObjects <- function(..., condition, env = globalenv()) {
call <- as.character(match.call())
names <- call[2:(length(call)-1)] #this isn't ideal as it doesn't consider the case where one would place 'condition' argument before the objects to subset
for (name in names) {
value <- get(name, envir = env)
assign(name, subset(value, subset = condition),envir = env)
}
}
Как вы видите, в комментарии, это не является совершенным. Может быть, кто-то может предложить что-то более эффективное.
Для второго случая, я ищу что-то похожее на with()
, в котором каждый вектор, матрица или фрейм данных будут автоматически подмножаться в соответствии с условием. Это будет выглядеть так:
result <- withCondition(condition, expression)
Если такой функции нет, я мог бы написать свое собственное, но я не уверен, как это сделать.
Благодаря
Жан
почему бы не использовать что-то вроде 'lapply (list_of_matrices, function (x) x [condition,])' ?? или даже проще: 'lapply (list_of_matrices, subset, vector ==" C ")', хотя я не уверен, что я уйду на 100%, что вы хотите, один простой пример от начала до конца поможет – grrgrrbla
. Для этого сначала потребуется создать список объектов, а затем извлечение объектов из списка, и я не очень привык к работе со списками. Но я принимаю к сведению.n – jeanlain
Я хочу превратить результат <- myNucleotideVector [условие] - object2 [условие] + dataframe1 [conditon, 2] 'в' result <- withCondition (условие, myNucleotideVector - object2 + dataframe1 [, 2]) 'но мне нужно соответствующую функциюCondition(). – jeanlain