我希望函数'count'计算“运算符”= 1(<),= 2(=),= 3(>)满足'critvalue'的'data'中的条目数。
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)
任何帮助,弄清楚为什么这在申请函数中不起作用将不胜感激。
另外,我肯定会对已经算作这样的基本函数感兴趣。我试过'sum',但不知道如何在申请中使用它。
sum(m == 6) #works
apply(m,1,sum, #no idea how set the criteria for being equal to 6
答案 0 :(得分: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
:
如果返回所评估的表达式的值,或者如果返回NULL则为NULL 没有(如果没有别的话可能会发生)。
因此,如果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
在这里更方便。