二元运算符的非数字参数

时间:2014-11-04 19:57:43

标签: r function binary numeric

我有一个数据框T,它是数字和字符串的混合:

 T1<-c(1,2, 3,4,6)
 T2<-c(4,5, 5,7,8)
 T3<-c("a","b","c","d","e")
 T4<-c(4,5, 5,7,8)
 T5<-c(4,5, 5,7,8)
 T<-data.frame(T1,T2,T3,T4,T5)

当我使用以下代码将函数应用于每行的数值时:

  P=apply(T,1,FUN=function(x) ifelse(x[1]>=x[4]+2*x[5],1,0))

它始终给出错误消息“2 * x [5]中的错误:二元运算符的非数字参数”。但如果我用所有数值替换T3,它就能完美运行。

我对此感到困惑,并且想知道任何人有任何见解吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

您将每行强制转换为字符,因为T3包含在apply从数据帧传递给函数的内容中。您可以通过以下方式解决此问题:

P=apply(T[-3],1,FUN=function(x) ifelse(x[1]>=x[3]+2*x[4],1,0))

错误不是来自比较,而是来自尝试将字符值乘以数字。它也可能成功:

P=apply(T,1,FUN=function(x) ifelse(as.numeric(x[1])>= as.numeric(x[4])+ 
                                                  2*as.numeric(x[5])
                                   ,1,0))

但这是“错误的”。 apply的使用适用于列的所有模式相同的矩阵,但它通常比像ifelse这样的矢量化函数更慢,这些函数提供行式处理而不诉诸apply 。应该是:

P=with(T,  ifelse(T1 >= T4 +  2*T5, 1,0) )

或者只使用布尔运算并转换回数字0/1:

P=  with(T, as.numeric( T1 >= T4 +  2*T5 ) ) # @akrun gets the check