0

我写了以下函数:

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  

我可能会犯什么小错误?我已经开始了一个新的会话,但我仍然遇到同样的问题。

4

2 回答 2

6

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

有两种可能的解决方案:

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

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

    apply(mydf[ , -1], 1, practice)
    
于 2012-12-03T16:29:24.460 回答
4

另一种解决方案是使用by

# Put in a character to mydf to test
mydf$foo<-'a'
# Run by
by(mydf,seq(nrow(mydf)),practice)
于 2012-12-03T16:37:43.233 回答