2017-07-29 4 views
0

データフレーム内の1つの列に、各行に対して適用できる関数を作成しようとしています。大きいデータフレームでのデータフレーム列の参照

私は、データフレームに合計売上値を入力し、それが入る範囲を検索します(1000の値のデータベース - minsales、maxsales、およびcommissionの列を持ちます) )、そして手数料を返す。

データフレームの列全体に適用しようとすると、これを実行するための機能が作成されていますが、個々の行では機能しません。行を次の行に移動します。私はいつも "長いオブジェクトの長さは短いオブジェクトの長さの倍数ではない"という警告を受け取ります。これは、列の値を取って、約1000値のデータベースと比較しようとした結果だと仮定します。私はそれがちょうど警告であることを認識していますが、私はそれが私のコードが傷ついている理由だと推測しています。

これまでのところ、私は、サイト上の他の回答を示唆しているように私の機能のためにapplylapplyを使用しようとしましたが、私は(私は定義していても「未使用の引数(X [I]])」になってしまいます私の他の必要な引数は適切に)、それでも、私はまだ "長いオブジェクトの長さは短いオブジェクトの長さの倍数ではありません"を取得します。言い換えれば

、私はこの(値は一例であり)生産テーブルたい:

Sales CommIndexnum(Function applied to entire col) Commission 
    210000 1           25771 
    210250 2           25901 
    211000 3           26031 

しかし、現在、私はこれで終わると、オブジェクトの長さの警告(値は一例です):

Sales CommIndexnum(Function applied to entire col) Commission 
25000 1            25771 
30000 1            25771(wrong return value) 
35000 1            25771(wrong return value) 

ルックアップ機能のように見えるので、値の返り値を省略しました。

# database call 
Database <- read.csv("database.csv") 


# lookup function that returns index number of commission 
    commissionindexnum <- function(totalsales, minv, maxv) { 
     which(totalsales >= minv & totalsales <= maxv) 
    }  

# test data frame 
Employee <- 
    data.frame(
    Name = character(3), 
    #sales amount used for lookup 
    TotalSales = c(212000, 209000, 211000), 
    #index number for the value to be used for commission 
    CommissionIndexnum = double(3), 
    #empty vector- lookup return values should go into the commission section 
    Commission = double(3) 
) 

# errors appear here (database has ~1000 values- total sales amount would be searched for in it) 
Employee[,3] <- commissionindexnum(Employee[,2], Database$Min, Database$Max), 

部分的なデータベース(CSVなど)::

Min,Max,Commission 
209740,210239,25771 
210240,210739,25901 
210740,211239,26031 
211240,211739,26161 
211740,212239,26291 
212240,212739,26421 
+0

私はちょっと混乱しています。再現可能な例がなければ何をすべきか正確に知ることは難しいです。データベースのデータフレームの少なくとも一部を追加できますか? –

+0

はい、私たちに再現可能な例を与えてください。あなたのタグを光沢のないものとして見直したいかもしれません。 '地図? ' –

+0

更新 - マップを確認しました。私はそれを正しく理解していれば、それはリスト/カラムを取ることができ、関数が使われていれば同じものを返すでしょうか? – Shan

答えて

0

alistaireさんのコメントへの回答のおかげを発見ここに私のメインのコードです。 findIntervalを使用する元のルックアップ機能を変更すると、すべての問題が修正されます。最小カラムを使用して動作します(実際の答えより上の値は最大値ではありません)。

commissionamt <- function(column, totalsales, minv) { 
    column [findInterval(totalsales, minv)] 
} 

#database name kept for example consistency 
Employee[, 4] <-commissionamt(Database$Commission, Employee[, 2], Database$Min) 
関連する問題