我想做的事情似乎超级简单,但我无法解决它,我已经四处寻找类似的问题,但仍然无法解决它...很可能这是一个愚蠢的问题,但在这里它去......
我有一列列出位置,另外两列列出开始和结束,只需检查位置是否在开始和结束定义的范围内,对于每一行......
MWE:
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 :(得分: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 :(得分: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
答案 2 :(得分:0)
易于理解循环:
checkBetween = c()
for(i in 1:length(my.df)){
checkBetween&lt; - append(checkBetween,within.range(my.df $ pos [i],my.df $ start [i],&gt; my.df $ end [i]))
}