2014-11-27 1 views
0

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

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

ММВХ:

within.range <- function(pos, start, end){ 
    if (pos>=start & pos<=end){ 
    return(TRUE) 
    } else{ 
    return(FALSE) 
    } 
} 

my.df <- data.frame(gene=c("A","B","C","D","E"), chr=c(1,2,3,4,5), pos=as.numeric(c(34,23,6,46,765)), start=as.numeric(c(45,15,2,32,765)), end=as.numeric(c(86,38,9,41,767))) 
my.df 

Как передать функцию в фрейм данных? Моя лучшая попытка:

apply(my.df[,c("pos","start","end")], 1, within.range, start=my.df$start, end=my.df$end) 

Но это, очевидно, неправильно ... Может быть, есть целый лучший способ сделать то же ... Спасибо!

+0

в вашей функции, вам не нужно, если заявление, как вы просите ", если TRUE, возвратного (TRUE) еще retrun (FALSE) ", поэтому ваша функция может быть уменьшена до только' pos> = start & pos <= end'. Ваш оператор 'apply' не может работать, потому что вы вводите вектор длины 5 для начала и конца, где каждый вызов вашей функции нуждается в неумеренном количестве. – Cath

ответ

3

Нет необходимости в apply петлями здесь, просто сделать

with(my.df, start <= pos & end >= pos) 
## [1] FALSE TRUE TRUE FALSE TRUE 

Если вы хотите, чтобы добавить его в качестве столбца, используйте transform

transform(my.df, check.pos = start <= pos & end >= pos) 
# gene chr pos start end check.pos 
# 1 A 1 34 45 86  FALSE 
# 2 B 2 23 15 38  TRUE 
# 3 C 3 6  2 9  TRUE 
# 4 D 4 46 32 41  FALSE 
# 5 E 5 765 765 767  TRUE 
1

Может быть, это может работать:

check.pos<-apply(my.df[,3:5],1,function(vec){vec[1] >= vec[2] & vec[1] <= vec[3]}) 


> check.pos 
[1] FALSE TRUE TRUE FALSE TRUE 
+0

это идеально подходит для того, что я хочу добиться! , но для общего вопроса о передаче данной функции с несколькими параметрами в кадр данных, используя только некоторые столбцы ... есть ли решение? – DaniCee

+0

@ DaniCee, это зависит от ваших «множественных пареметров», вы можете сделать (примените (df [, somecolumns], 1, myfunction, param1 = param1, param2 = param2) ', как вы, но если параметры одинаковы для каждого «вызов» функции – Cath

0

Легко понять Петля:

checkBetween = с()
для (я в 1: длина (my.df)) {
checkBetween < - добавление (checkBetween, within.range (my.df $ поз [I], my.df $ начать [I]> my.df $ конца [I]))
}

Смежные вопросы