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

2番目のデータフレームの最初の列の値は「文字」タイプです。その結果、このコマンドapplyはデータフレーム全体を文字マトリックスに変換します。演算子+は文字値に対して定義されていません。

2つの可能な解決策があります:

  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 に答える