`if`函数中的二元运算符错误

时间:2012-12-03 16:23:14

标签: r

我写了以下函数:

x    <- 1:4
y    <- c(1,2,7,4)
mydf <- data.frame(a=x,b=x,c=x,d=x,y=y)

practice  <-  function(x) if( x[1] == x[5]) {

             foo <- (x[2])
             return(foo)

              } else {

              bar     <- x[3] + x[4]                
              foobar <- x[2] - bar

               return(foobar)
              }       

newmydf <- apply( mydf, 1, practice)

这在data.frame提供的工作正常。但是我有另一个data.frame而且我一直在

Error in x[3] + x[4] : non-numeric argument to binary operator

尽管有以下str()

'data.frame':   133 obs. of  19 variables:
 $  : chr   ...
 $ : int   ...
 $ : int  ...
 $ : int  ...
 $ : int   ...
 $ : int   ...
 $ : int   ...
 $ : int   ...
 $ : int  ...
 $ : int  ...
 $ : int   ...
 $ : int   ...
 $ : int  ...
 $ : int  ...
 $ : int   ...
 $ : int  ...
 $ : num  ...
 $ : int  
 $ : int  

我可以制作哪些小滑倒?我已经开始了一个新的会议,我仍然遇到同样的问题。

2 个答案:

答案 0 :(得分:6)

第二个数据框的第一列中的值是“字符”类型。结果,命令apply将整个数据帧转换为字符矩阵。未为字符值定义运算符+

有两种可能的解决方案:

  1. 将第一列转换为数字类型(如果可能):

    mydf[ , 1] <- as.numeric(mydf[ , 1])
    
  2. 请勿使用数据框的第一列:

    apply(mydf[ , -1], 1, practice)
    

答案 1 :(得分:4)

另一种解决方案是使用by

# Put in a character to mydf to test
mydf$foo<-'a'
# Run by
by(mydf,seq(nrow(mydf)),practice)