0

我希望函数'count'通过'operator' = 1(<),=2(=),= 3(>)计算'data'中满足'critvalue'的条目数。

count = function(data,critvalue,operator=2) { 
    if (operator == 1){
        sum(data < critvalue)}
    if (operator == 2){ 
        sum(data == critvalue)}
    if (operator == 3){
        sum(data > critvalue)}}

它适用于值向量:

count(rep(6,10),critvalue=5,operator=1)

当我将此函数应用于矩阵以按行计数时,它不起作用:

m = rbind(1:10,1:10,1:10)
apply(m, 1, count, critvalue = 6)

但是,当我将函数“count”定义为不采用运算符参数时,它会以某种方式起作用

count = function(data,critvalue,operator=2) {
     sum(data == critvalue)}

apply(m, 1, count, critvalue = 6)

任何帮助弄清楚为什么这在 apply 函数中不起作用将不胜感激。

另外,我肯定会对已经算得上这样的基本函数感兴趣。我试过'sum',但不知道如何在应用中使用它。

sum(m == 6)  #works

apply(m,1,sum,   #no idea how set the criteria for being equal to 6
4

1 回答 1

2

我会使用switch

m <- matrix(c(1:10,1:10,1:10),ncol=3)

count <- function(data,critvalue,operator=2) { 
  switch(operator,
         sum(data < critvalue),
         sum(data == critvalue),
         sum(data > critvalue))
}

apply(m, 1, count, critvalue = 6)
#[1] 0 0 0 0 0 3 0 0 0 0

apply(m, 1, count, critvalue = 6, operator = 3)
#[1] 0 0 0 0 0 0 3 3 3 3

编辑:为什么你的功能不起作用。

来自?return

如果在没有调用 return 的情况下到达函数的末尾,则返回最后计算的表达式的值。

函数的最后一个表达式是if (operator == 3){ sum(data > critvalue)}.

来自?if

if 返回计算的表达式的值,如果没有返回值,则返回 NULL(如果没有 else 则可能发生)。

因此,如果operator!= 3 您的函数返回NULL

apply(m, 1, count, critvalue = 6)
#NULL

您可以使用以下方法解决此问题return

count <- function(data,critvalue,operator=2) { 
  if (operator == 1){
    return(sum(data < critvalue))}
  if (operator == 2){ 
    return(sum(data == critvalue))}
  if (operator == 3){
    return(sum(data > critvalue))}}    

apply(m, 1, count, critvalue = 6)
#[1] 0 0 0 0 0 3 0 0 0 0

不过,switch这里比较方便。

于 2013-05-27T17:50:41.740 回答