R:使用多个参数将函数传递给数据帧行,仅使用一些列

时间:2014-11-27 08:42:06

标签: r function parameters dataframe apply

我想做的事情似乎超级简单,但我无法解决它,我已经四处寻找类似的问题,但仍然无法解决它...很可能这是一个愚蠢的问题,但在这里它去......

我有一列列出位置,另外两列列出开始和结束,只需检查位置是否在开始和结束定义的范围内,对于每一行......

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)

但这显然是不正确的...也许有更好的方法可以实现同样的目标......谢谢!

3 个答案:

答案 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]))
  }