2017-07-29 100 views
0

我想創建一個函數,可以應用於數據框中的單個列,每行。更大的數據幀中的數據幀列查找

我想要的功能是將總銷售價值輸入到數據框中,搜索它所處的範圍(在1000個值的數據庫中 - 它有一列minsales,maxsales和佣金),然後退還佣金。

我已經創建了一個工作函數來做到這一點,但是,當我嘗試將其應用於數據框的整個列時,它不適用於每個單獨的行 - 它僅從第一個排成後續行。我總是得到警告「更長的對象長度不是更短的對象長度的倍數」,我假設這是嘗試獲取列值的結果,並嘗試將其與約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可以解決所有問題。使用min列工作(不是max-返回實際答案以上的值)。

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

#database name kept for example consistency 
Employee[, 4] <-commissionamt(Database$Commission, Employee[, 2], Database$Min)